this的指向问题
1,被嵌套的函数独立调用时,this默认绑定到window
//虽然test()函数被嵌套在obj.foo()函数中。但test()函数是独立调用,而不是方法调用,所有this默认绑定到window
/**被嵌套的函数独立调用时,this默认绑定到window**/ var a = 0; var obj = { a:2, foo:function(){ console.log(this.a); //2 这里的this指向obj function test(){ console.log(this.a); //0 这里的this指向window } test(); } }; obj.foo();
2,闭包
类似地,test()函数是独立调用,而不是方法调用,所以this默认绑定到window
var a = 0; function foo(){ function test(){ console.log(this.a); } return test; }; var obj = { a : 2, foo:foo } obj.foo()();//0
由于闭包的this默认绑定到window对象,但又常常需要访问嵌套函数的this,所以常常在嵌套函数中使用var that = this ,然后
在闭包中使用that替代this,使用作用域查找的方法来找到嵌套函数的this值
var a = 0; function foo(){ var that = this; function test(){ console.log(that.a); } return test; }; var obj = { a : 2, foo:foo } obj.foo()();//2
补充:
《JS 高级程序设计》里给的解释:更深层次的解释了闭包里的this指向问题。
This对象是在运行时,基于函数的执行环境绑定的。
在全局函数中,this等于window。
而当函数被作为某个对象的方法调用时,this等于那个对象。
不过匿名函数的执行环境具有全局性,因此其this对象通常指向window.
var name = "The Window"; var object = { name:"My object", getNameFunc:function(){ return function (){ return this.name; } } }; alert(object.getNameFunc()()); //the window
先创建了一个全局变量name,又创建了一个包含name属性的对象,这个对象还包含一个方法——getNameFunc(), 它返回一个匿名函数,而匿名函数又返回this.name
由于getNameFunc()返回一个函数。因此调用object.getNameFunc()()就会立即调用返回它的函数,结果就是返回一个字符串,然而,这个例子返回的字符串是
"The Window",即全局变量name的值,为什么匿名函数没有取得其包含作用域,的this对象呢?
前面曾经提到过,每个函数在被调用时,其活动对象都会自动取得两个特殊变量:this和arguments.内部在搜索这两个变量时,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的
这两个变量。而匿名函数的执行环境具有全局性。因此this通常指向window.不过,把外部作用域中的this对象保存在一个闭包能够访问到的变量里,就可以让闭包访问该对象了。
var name = "The window"; var object = { name:"My Object", getNameFunc:function(){ var that = this; return function(){ return that.name; } } }
3,隐式绑定
一般地,被直接对象所包含的函数调用时,也称为方法调用,this隐式绑定到该直接对象
function foo(){ console.log(this.a); }; var obj1 = { a:1, foo:foo, obj2:{ a:2, foo:foo } } //foo()函数的直接对象是obj1,this隐式绑定到obj1 obj1.foo();//1 //foo()函数的直接对象是obj2,this隐式绑定到obj2 obj1.obj2.foo();//2
补充一点:
oDiv.onclick = function(){ this : 这里的this指向oDiv } /*---------------------------------------------*/ oDiv.onclick = show; function show(){ this:----指向oDiv } /*---------------------------------------------*/ oDiv.onclick = function(){ show() } function show(){ this :这里的this指向 window }