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

Jam*_*ice 7 javascript

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

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

var arr = [function() {
    console.dir(this);
}];
Run Code Online (Sandbox Code Playgroud)

我本来希望this引用Window对象.但是,在调用函数时:

arr[0]();? //Logs Array
Run Code Online (Sandbox Code Playgroud)

它似乎this实际上是指数组.然后,当我在另一个变量中存储对该函数的引用并调用它时,this 确实引用了Window对象:

var func = arr[0];
func(); //Logs Window
Run Code Online (Sandbox Code Playgroud)

那么,为什么函数的上下文会发生变化?这是展示上述两种情况小提琴.

Fel*_*ing 5

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

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

有关详细信息,请参阅MDN -this在本例中:

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

在第二种情况下,您将函数称为"独立",因此this指的是window.如果代码是在严格模式下运行的话,那this就是undefined.