闭包中的this
匿名函数的执行环境具有全局性,因此this经常指向window。
var name = "window";
var obj = {
name : "obj",
getName : function(){
return function(){
return this.name;
}
}
};
console.log(obj.getName()());
以上代码执行结果:
window
闭包的活动对象中的this,有明确指向的只有window。为了解决这个问题,我们可以将外部作用域的this对象保存在一个变量里,就可以让闭包访问了。
var name = "window";
var obj = {
name : "obj",
getName : function(){
var that = this;
return function(){
return that.name;
}
}
};
console.log(obj.getName()());
以上代码执行结果:
obj
因为that是我们在包含函数中特意声明的一个变量,因此闭包可以通过that访问到外部函数的this,即obj。
还有一种特殊情况会使this的值改变
var name = "window";
var obj = {
name : "obj",
getName : function(){
return this.name;
}
};
var getname2 = obj.getName;
console.log(obj.getName();
console.log(getname2());
以上代码执行结果:
obj
window
当把方法赋值给getname2时,由于getname2属于window,因此this的指向就不能得到维持。