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

Javascript 数组中函数的上下文是什么?,javascript,Javascript,这是我确信我应该知道答案的事情,但不是我太愚蠢,就是我以前从未遇到过 给定以下数组,在全局范围中声明: var arr = [function() { console.dir(this); }]; 我希望这个引用窗口对象。但是,调用函数时: arr[0]();​ //Logs Array 看起来,这个实际上是指数组。然后,当我在另一个变量中存储对函数的引用并调用该变量时,此确实引用窗口对象: var func = arr[0]; func(); //Logs Window 那么,为

这是我确信我应该知道答案的事情,但不是我太愚蠢,就是我以前从未遇到过

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

var arr = [function() {
    console.dir(this);
}];
我希望
这个
引用窗口对象。但是,调用函数时:

arr[0]();​ //Logs Array
看起来,
这个
实际上是指数组。然后,当我在另一个变量中存储对函数的引用并调用该变量时,
确实引用窗口对象:

var func = arr[0];
func(); //Logs Window

那么,为什么函数的上下文会发生变化呢?这里有一个.

这是因为
这个
关键字实际上是一个操作符,它将引用返回给调用它的函数的持有者(或所有者)。因为在第一种情况下,持有者是一个数组(它是一个对象),所以它返回一个数组。在第二种情况下,保持器是窗口对象

有关更多详细信息,请参阅。

请注意:

在JavaScript中,
始终指函数所有者。


您可以阅读更多有关它的信息。

因为元素是数组的一个成员,并且
这个
始终指向所有者对象(除非您使用
绑定()
/
调用()
/
应用()
等)。如果您不是对象的一部分,
将是全局对象;它是浏览器环境中的
窗口
。例外情况是,如果您处于严格模式,其中

您所做的实际上与以下内容相同:

var ar = {
    '0' : function () {
         console.dir(this);
     }
}

ar[0]();
var func = ar[0];
func();
。。。这在概念上可能更有意义


当您将函数作为对象的属性调用时,例如
obj.func()
指的是
obj

这正是你在这里所做的
arr
是您的对象,
0
是保存函数的属性


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

有关更多信息,请参阅,在这种情况下:

当函数作为对象的方法调用时,其
this
设置为调用该方法的对象


在第二种情况下,调用函数“standalone”,因此
指的是
窗口
。但是,如果代码是在严格模式下运行的,
这个
将是
未定义的

这个
指的是所有者,所以我猜在执行时会查找所有者。不太一样。数组是一种不同的“类型”,与普通对象有着不同的行为。@MichaelAnderson:我的意思是从
this
的分辨率来看。更准确地说,
window
是一个对象,每个全局变量都是
window
的参数。毕竟,数组只是对象而已。。。这就很有道理了。我只是太傻了。谢谢。@freakish:这和这个问题有什么关系<代码>此
指的是
窗口
,即使变量不是全局变量。在OP的代码中,
func
也可以是其他函数中的局部变量。我想你的意思是全局变量是
window
的属性@James:这是一个有趣的问题。我必须承认,我从来没有真正想过它。@FelixKling-是的,我也从来没有真正想过它(因此这个问题)。很明显,现在我有了答案。我知道这将是一件简单的事情,我真的应该能够弄明白。再次感谢:)