js小点1:
function a (x) {
return x * 2;
}
var a;
alert (a);
js永远是先解析声明式函数,再解析变量,但不会赋值
执行顺序:
1,解析函数a
2,声明变量var a;此时a并没有赋值,所以a=function a
js小点2:
js中没有块的概念--比如for(var i in array)中的i依然是全局变量
js小点3:
function b (x, y, a) {
arguments[2] = 10;
alert (a);
}
b(1, 2, 3);
分析:在函数内部可以引用一个对象,它是arguments类似数组,但不是数组。它代表了函数实际接收参数的集合。可以通过下标对相应参数进行访问。如果修改此对象某些属性,如arguments[index],则被传进来的第index(如果有的话,下标从0开始)变量的值也会被修改。
arguments[2]类似数组,但不是数组,作用是赋值给相对应角标的变量
js小点4:
function a () {
alert (this);
}
a.call (null);
call方法接受多个参数,其作用是借用别人的方法当作自己的方法。这样能保证执行的时候this能够指向自己。call方法的第二个参数到最后一个参数是传给借用过来函数的。第一个参数是借用的对象,如果这个对象为空,那么将会作为全局window对象调用。即函数中的this指向window。
js小点5:
在采用定义式创建同名函数时,后创建的函数会覆盖先创建的函数。这种差别是由于JavaScript解释引擎的工作机制所导致的。
JavaScript解释引擎在执行任何函数调用之前,首先会在全局作用域中注册以定义式创建的函数,然后再依次执行函数调用。由于注册函数时,后定义的函数重写了先定义的函数,因此无论调用语句位于何处,执行的都是后定义的函数。
相反,对于声明式创建的函数,JavaScript解释引擎会像对待任何声明的变量一样,等到执行调用该变量的代码时才会对变量求值。
由于JavaScript代码是从上到下顺序执行的,因此当执行第一个example()调用时,example函数的代码就是首先定义代码;而当执行第二个example()调用时,example函数的代码又变成了后来定义的代码。
js小点6:
js是解释型语言而非编译型语言,代码在执行期才被解析器一行一行地动态编译和执行而不是执行之前完成编译
js边编译边执行
变量的声明在预编译期被处理,在执行期对所有代码来说都是可见的
变量的初始化过程发生在执行期而不是预编译期,执行期js解释器按照代码顺序进行解释执行
在js代码之前声明全局变量和函数并且为全局变量初始化赋值,在函数内部也应该先声明变量后引用
js小点7:
函数中声明的所有变量,无论是在哪里声明的,在整个函数中它们都是有定义的
js小点8:
创建对象:
用var anObject=new aFunction()形式创建对象的过程实际上分为3步:
1,创建一个新对象
2,将该对象内置的原型对象设置为构造函数prototype引用的那个原型对象
3,将该对象作为this参数调用构造函数,完成成员设置等初始化工作
对象建立之后,对象上的任何访问和操作都只与对象自身及其原型链上的那串对象有关,和构造函数无关
换句话说,构造函数只是在穿件对象是起到介绍原型对象和初始化对象的两个作用
原型链:
每个对象(指大括号括起来的object,不包括function,array)都会在其内部初始化一个属性,就是
_proto_,当我们访问一个对象的属性石,如果这个对象内部不存在这个属性,那么就会去proto里面找这个属性,
这个proto又会有自己的proto,就这样一直找下去
js小点9:数据类型的检测
判断数据类型可能想到的方法:
constructor、typeof、instanceof、Object.prototype.toString.call()
1、通过constructor属性
通过constructor属性获取类型的方法很容易被修改,不应该用来判断类型。
2、通过typeof
typeof是一个操作符,而不是个函数。
typeof的实际应用是用来检测一个对象是否已经定义或者是否已经赋值。
如if(typeof a!="undefined"){},而不要去使用if(a)因为如果a不存在(未声明)则会出错。
typeof检测对象类型时一般只能返回如下几个结果:
number,boolean,string,function,object,undefined。
对于Array,Null,自定义对象 等使用typeof一律返回object,
这正是typeof的局限性。
3、通过 instanceof
用instanceof操作符来判断对象是否是某个类的实例。
如果obj instanceof Class返回true,那么Class的原型与obj原型链上的某个原型是同一个对象,
即obj要么由Class创建,要么由Class的子类创建。
4、通过 Object.prototype.toString.call()
Object.prototype.toString.call() 作用是:
1、获取对象的类名(对象类型)。
2、然后将[object、获取的类名]组合并返回。
可应用于判断Array,Date,Function等类型的对象
js小点10:
闭包:
function a(){
var i=0;
function b(){
alert(++i);
}
return b;
}
var c = a();
c();
代码特点:
1,函数b嵌套在函数a内部
2,函数a返回函数b
当一个函数的内部函数被该函数之外的一个变量引用的时候,就创建一个闭包
闭包的作用是在函数执行完并返回后,是的javascript的垃圾回收机制不会回收当前函数所占用的资源
因为函数的内部函数的执行需要依赖该函数当中变量。