这是我确定应该知道答案的事情,但要么我只是愚蠢,要么我以前从未遇到过......
给定以下数组,在全局范围内声明:
var arr = [function() {
console.dir(this);
}];
我希望this
能够引用Window对象。但是,在调用函数时:
arr[0](); //Logs Array
this
实际上是指数组。然后,当我在另一个变量中存储对该函数的引用并调用它时,this
引用Window对象:
var func = arr[0];
func(); //Logs Window
那么,为什么函数的上下文会发生变化?这是一个fiddle demonstrating the above two cases。
答案 0 :(得分:5)
当您将某个函数作为对象的属性调用时,obj.func()
,this
会引用obj
。
这正是你在这里所做的。 arr
是您的对象,0
是持有函数的属性。
注意:毕竟,数组只是对象,它们的元素是它们属性的值(虽然属性通常是数字字符串(所有属性都是字符串))。
有关详细信息,请参阅MDN - this
:
当一个函数作为一个对象的方法被调用时,它的
this
被设置为调用该方法的对象。
在第二种情况下,您将该功能称为“独立”,因此this
引用window
。如果代码是在严格模式下运行的,this
将是undefined
。
答案 1 :(得分:0)
这是因为this
关键字实际上是一个运算符,它返回对调用它的函数的持有者(或所有者)的引用。因为在第一种情况下,holder是一个数组(它是一个对象),它返回一个数组。在第二种情况下,持有者是窗口对象。
有关详细信息,请参阅this article。
答案 2 :(得分:0)
答案 3 :(得分:0)
因为该元素是数组的成员,并且this
总是指向所有者对象(除非您使用bind()
/ call()
/ { {1}}等等。如果您不是对象的一部分,apply()
将成为全局对象;在浏览器环境中为this
。例外情况是,如果您处于严格模式,window
will be undefined
。
你正在做的事情实际上与:
相同this
......这在概念上可能更有意义。