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

What is the context of a function in an array?

本文关键字:上下文 是什么 函数 数组      更新时间:2023-09-26

我相信我应该知道答案,但要么我只是愚蠢,要么我以前从未遇到过。。。

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

var arr = [function() {
    console.dir(this);
}];

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

arr[0]();​ //Logs Array

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

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

那么,为什么函数的上下文会发生变化呢?这是一把小提琴,用来演示上面两种情况。

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

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

请参阅MDN-this了解更多信息,在这种情况下:

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

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

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

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

注意:

在JavaScript中,this总是指函数所有者

你可以在怪癖网站上读到更多关于它的信息。

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

你所做的实际上与相同

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

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

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