this对象是在运行时基于函数的执行环境绑定的:
- 在全局函数中,this等于window
- 当函数被作为某个对象的方法调用时,this等于那个对象
- 匿名函数的this通常指向window
我们重点来说一下匿名函数的this指向。
var name = "The window";
var object = {
name:"My Object",
getNameFunc:function () {
return function () { //匿名函数
return this.name;
};
}
};
alert(object.getNameFunc()());// "The window"
上述代码先创建了一个全局变量name,又创建了一个包含name属性的对象object。这个对象还包含一个方法——getNameFunc(),它返回的是一个匿名函数,匿名函数返回的是this.name。
匿名函数没有取得其包含作用域的this对象。
我们把其包含作用域的this对象保存在一个闭包能够访问到的变量里,就可以让闭包访问该对象了。
var name = "The window";
var object = {
name:"My Object",
getNameFunc:function () {
var that = this;
return function () {
return that.name;
};
}
};
alert(object.getNameFunc()()); //"My Object"
在定义匿名函数之前,我们把this对象赋值给一个名叫that的变量,在定义闭包后,闭包也可以访问这个变量,因为它是我们在包含函数中特意声明的一个变量。
即便在函数返回之后,that也仍然引用着object,所以返回的就是My Object。
相当于this的值得以维持。