无意中在网上看到了一段关于闭包的代码:
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
},
getName:function(){
alert(this.name);
}
};
alert(object.getNameFunc()()); //The Window
object.getName(); //My Object
为什么alert(object.getNameFunc()());
会弹出The Window?大大们指点一下迷津,多谢!
感谢各位的回复
我认为代码写成下面这个形式可能更利于你理解:
函数
getNameFunc
内返回一个闭包,因此this
指向全局对象,所以this.name
即为定义在全部作用域下的name("The Window")
。而函数
getName
内并未返回闭包,因此this
指向当前对象,所以this.name
即为当前作用域下的name("My Object")
。你要明白一点,正是因为闭包的使用,才使得当前作用域可以访问外部的作用域成为可能。
为了让题主明白,我再举一个
this
不指向全局对象的例子:这样也可以:
看到了吧,不能说闭包内的
this
就一定是指向全局对象,你要明白我们使用闭包的目的是什么,这里就是为了连接函数内部和外部的作用域,还有一个用处就是保存变量,例如循环中的闭包。我之前译过两篇博文,题主可以一读:
题主,我刚刚总结了一篇关于闭包的博文,你可以读下: