7

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

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

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

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

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

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

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

那么,为什么函数的上下文会改变呢?这是一个演示上述两种情况的小提琴

4

4 回答 4

5

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

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

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

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

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

于 2012-04-04T10:04:16.827 回答
0

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

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

于 2012-04-04T10:01:44.970 回答
0

请注意:

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

你可以在 quirksmode阅读更多关于它的信息。

于 2012-04-04T10:02:13.497 回答
0

因为元素是数组的成员,并且this 总是指向所有者对象(除非你玩弄bind()//等)call()apply()如果您不是对象的一部分,this则将是全局对象;这是window在浏览器环境中。例外情况是,如果您处于严格模式,this 那么undefined.

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

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

ar[0]();
var func = ar[0];
func();

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

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

于 2012-04-04T10:02:38.073 回答