数组中函数的上下文是什么?

时间:2012-04-04 09:57:16

标签: javascript

这是我确定应该知道答案的事情,但要么我只是愚蠢,要么我以前从未遇到过......

给定以下数组,在全局范围内声明:

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

4 个答案:

答案 0 :(得分:5)

当您将某个函数作为对象的属性调用时,obj.func()this会引用obj
这正是你在这里所做的。 arr是您的对象,0是持有函数的属性。

注意:毕竟,数组只是对象,它们的元素是它们属性的值(虽然属性通常是数字字符串(所有属性都是字符串))。

有关详细信息,请参阅MDN - this

  

当一个函数作为一个对象的方法被调用时,它的this被设置为调用该方法的对象。

在第二种情况下,您将该功能称为“独立”,因此this引用window。如果代码是在严格模式下运行的,this将是undefined

答案 1 :(得分:0)

这是因为this关键字实际上是一个运算符,它返回对调用它的函数的持有者(或所有者)的引用。因为在第一种情况下,holder是一个数组(它是一个对象),它返回一个数组。在第二种情况下,持有者是窗口对象。

有关详细信息,请参阅this article

答案 2 :(得分:0)

请注意:

JavaScript中的

this始终引用功能所有者。

您可以阅读更多相关信息at quirksmode

答案 3 :(得分:0)

因为该元素是数组的成员,并且this 总是指向所有者对象(除非您使用bind() / call() / { {1}}等等。如果您不是对象的一部分,apply()将成为全局对象;在浏览器环境中为this。例外情况是,如果您处于严格模式,window will be undefined

你正在做的事情实际上与:

相同
this

......这在概念上可能更有意义。

http://jsfiddle.net/TVtwr/1/