今天看高级程序设计时阅读到第七章看到了this的内容,是说在闭包中使用this的问题。
this对象: 是在运行时基于函数的执行环境绑定的(意思是谁在调用,this就是谁)
var name = "The Window";
var object = {
name: "My Object",
getNameFunc: function () {
return function () {
return this.name;
};
}
};
alert(object.getNameFunc()()); //"The Window"(在非严格模式下)
关于这个this指针的位置,编译器给出 return 出的 this.name 值 是The Window。
object.getNameFunc 在调用的时候 this 是指向 object的,但是getNameFunc 这个函数返回了一个匿名函数。首先,匿名函数的执行环境是全局的,所以返回出来的匿名函数在执行的时候 this就会指向 window.name 了 而不是 object.name。
在这个小节末端的代码使我感到有趣:
var name = "The Window";
var object = {
name: "My Object",
getName: function () {
return this.name;
}
};
object.getName(); //"My Object" 第一行
(object.getName)(); //"My Object" 第二行
(object.getName = object.getName)(); //"The Window",在非严格模式下 第三行
注释中我标注了第一行,第二行,第三行:
第一行毋庸置疑的,那么第二行,第三行什么意思呢?
第二行用括号括住了object.getName,但实质上他是括号内在引用object.getName ,执行环境依然是obejct。
第三行可能一开始会有点懵逼,但是分享一个概念,赋值表达式会返回这个值的本身,也就是说,当我们赋值了object.getName 之后,这个表达式会返回object.getName 的值(也就是 一个匿名函数 返回this.name)。
所以调用这个匿名函数时就会像第一个例子一样,由于执行环境在全局下,返回 The Window,如下:
(function () {
return this.name;
})(); // The Window