说到js中的函数中的this指针,就像是悟空的毫毛一样,可以随时变来变去,理解起来十分困难,但是万变不离其宗,都是悟空的毫毛而已 ^-^.
要中文js中的this,只要记住一点:[color=red]谁调用了该函数,那么该函数中的this就是指的它;如果没有看出是谁调用的,那么就是window调用的,因为只有它有这个权利[/color]。下面结合例子来理解:
例子1:
上面函数C中的this指针是执行 o 吗?
首先我们看,对象 o 调用了 函数 C() 吗?没有吧,对象 o 没有做任何事情!所以C中的this指针不是指向 o ,而是widow。这里其实可以看做是 window 调用 “new F()”,所以this指针是window,而不是 o ,因为o 并没有调用任何方法。
例子2:
上面的结果有这么理解呢?
1)因为obj 是一个对象,但是 prop 也是一个对象,所以第一个直接调用 getfullname()的是prop,所以打印的是 direnjie, 而不是 yuanfang
2)第二个 test 是一个全局变量,他的值是一个函数地址,test()调用其实就是:window.test(),所以打印的是全局的fullname,也就是 window.fullname;
如此而已。
关于call和apply会改变函数的调用者,所以也就改变了函数中的this指针。
要中文js中的this,只要记住一点:[color=red]谁调用了该函数,那么该函数中的this就是指的它;如果没有看出是谁调用的,那么就是window调用的,因为只有它有这个权利[/color]。下面结合例子来理解:
例子1:
function F(){
function C(){
return this;
}
return C();
}
var o = new F();
console.log(o); // 打印 Window
console.log(window); // 打印 Window
上面函数C中的this指针是执行 o 吗?
首先我们看,对象 o 调用了 函数 C() 吗?没有吧,对象 o 没有做任何事情!所以C中的this指针不是指向 o ,而是widow。这里其实可以看做是 window 调用 “new F()”,所以this指针是window,而不是 o ,因为o 并没有调用任何方法。
例子2:
var fullname = 'focus2008';
var obj = {
fullname:'yuanfang',
prop:{
fullname:'direnjie',
getfullname:function(){
return this.fullname;
}
}
};
console.log(obj.prop.getfullname()); // direnjie
var test = obj.prop.getfullname; // focus2008
console.log(test());
上面的结果有这么理解呢?
1)因为obj 是一个对象,但是 prop 也是一个对象,所以第一个直接调用 getfullname()的是prop,所以打印的是 direnjie, 而不是 yuanfang
2)第二个 test 是一个全局变量,他的值是一个函数地址,test()调用其实就是:window.test(),所以打印的是全局的fullname,也就是 window.fullname;
如此而已。
关于call和apply会改变函数的调用者,所以也就改变了函数中的this指针。