在这里主要说一下自己以前不理解的地方,以便参考:
其实对于一个函数而言,其定义方式有两种:一种是函数表达式的方式 例如: var fun = function(){.....},一种是函数声明就类似于这种:function fun(){......}。
虽然两者的基本功能一样,但是还是有区别的,主要体现在浏览器引擎上的识别问题:对于前者如果调用在前而定义的表达式在后就会报错,但是对于后者(函数声明)就不会报错,这是因为函数调用的时候有一个函数声明提升的过程,在这个过程中通过函数声明的函数会在执行任何代码之前被识别或者说可以调用,但是对于前者(函数表达式),只有当浏览器根据顺序读到该函数的内容的时候才会被解析。
注意:
要访问函数的指针(也就是函数本身内容,而不是执行的结果),就要去掉函数名后面的();好好体会一下,无论何时函数的名字只是包含着指针的变量而已(并且是引用类型的变量,你懂的)
另外:
在函数内部,两个对象特别重要一个是arguments,一个是this,要充分理解这这两个对象的意义至关重要。先说说arguments吧,我们知道函数里面的arguments是一个伪数组,里面保存的是当前函数的参数,但是这个数组还有一个属性callee,在这里arguments.callee指向的是拥有当前arguments的那个函数;
对于this,无论怎样只要记着一个原则就可以了,那就是this始终指向调用函数的那个对象,具体的根据函数的调用方式不同this的指向也会相应的改变:
1.纯粹的函数调用,那么this指向window,因为该函数的调用的对象是window(只有window才能调用);
2.作为构造函数调用,那么此时this的指向就是具体的实例了;
3.被当作对象方法调用,那么此时this指向这个对象;
4.函数里面套函数(函数的嵌套),这个时候就要分情况了:
如果在非严格模式下,this指向window,如果在严格模式下,指向undefined;
5.如果作为call或者apply调用,根据call和apply的职能就知道,this就指向第一个参数 ;
当然函数还有一个属性,那就是caller,这个属性包含者调用当前函数的函数的引用(值);如果是在全局调用函数,他的值伪null;
总而言之,可以得出一般性的结论,this永远指向当前函数的调用者,跟函数在哪里定义没有关系。
例如:
给元素的某一个事件绑定方法,当事件触发的时候,执行对应的方法,方法中的this是当前的元素;
document.getElementById("div1").onclick = fn;//fn中的this是#div1,
document.getElementById("div1").onclick = function () {
fn();//this->window//为什么呢,其实是这样的,在这里打印的this是fn函数里的this,而并不是绑定的匿名函数的this,当这个匿名函数执行的时候才会
调用fn,所以这里的this就是window
};
function fn() {
console.log(this);
}
还有不同作用域的
function sum() {
console.log("sum",this);//this->window
fn();//this->window
}
sum();
var oo = {
sum: function () {
console.log("oo.sum",this);//this->oo
fn();//this->window//同样的道理。同上
}
};
oo.sum();
function fn() {
console.log(this);
}