总结:个人认为 闭包返回的匿名函数的this作用域为此函数引用者的本身。
看代码吧:
var name="hello"; var object={ name:"my Object", getName:function (){ return function(){ return this.name; } } } var zhangsan = object.getName(); alert(zhangsan());
这边代码中 object的getName方法返回了一个匿名函数.函数中调用了this.
alert的结果为:hello;
为什么呢?因为 var zhangsan = object.getName();的时候 zhangsan 为全局变量.代码变为
var zhangsan = function(){ return this.name; }
此时的this.表示window。所以alert为hello;
改写上边代码
var name="hello"; var object={ name:"my Object", getName:function (){ return function(){ return this.name; } } } var tt={ name:"my tt", getName:object.getName() } alert(tt.getName());
此时.alert输出的为tt的name:my tt
因为object.getName()返回的匿名函数赋值给了tt对象上的一个属性。所以执行匿名函数时this的作用域为tt.
##或者这样可能更清晰的理解。把getName的方法引用重新赋值给object对象
object.cc = object.getName(); alert(object.cc());
结果为my Object!
当然为了不让匿名函数费劲的去寻找作用域可以这么写:
var name="hello"; var object={ name:"my Object", getName:function (){ var $this = this; return function(){ return $this.name; } } } alert(object.getName()())
得到结果为 myObject 在return匿名函数之前,把this赋值给一个变量.所以执行时$this为object。name值自然得到保留