使用严格时,为什么匿名函数中的“this”未定义?

时间:2012-03-22 12:45:32

标签: javascript anonymous-function use-strict

为什么在严格模式下使用javascript时,匿名函数中的 this 是未定义的?我理解为什么这可能有意义,但我找不到任何具体的答案。

示例:

(function () {
    "use strict";

    this.foo = "bar"; // *this* is undefined, why?
}());

小提琴测试:http://jsfiddle.net/Pyr5g/1/ 查看记录器(firebug)。

3 个答案:

答案 0 :(得分:92)

这是因为,在ECMAscript 262第5版之前,如果使用constructor pattern的人忘记使用new关键字,则会出现很大的混淆。如果您在ES3中调用构造函数时忘记使用newthis引用了全局对象(浏览器中的window),您将使用变量来破坏全局对象。

这是一种可怕的行为,所以ECMA的人决定,只是将this设置为undefined

示例:

function myConstructor() {
    this.a = 'foo';
    this.b = 'bar';
}

myInstance     = new myConstructor(); // all cool, all fine. a and b were created in a new local object
myBadInstance  = myConstructor(); // oh my gosh, we just created a, and b on the window object

最后一行会在ES5严格

中引发错误
"TypeError: this is undefined"

(这是一个更好的行为)

答案 1 :(得分:14)

有一种称为“装箱”的机制,它在进入被调用函数的上下文之前包装或更改this对象。 在您的情况下,this的值应为undefined,因为您没有将该函数作为对象的方法调用。 如果是非严格模式,在这种情况下,它将被window对象替换。 在strict模式下,它始终保持不变,这就是为什么undefined在这里。

您可以在以下链接找到更多信息 https://developer.mozilla.org/en/JavaScript/Strict_mode

答案 2 :(得分:6)

根据This Stack Overflow answer,您可以在匿名函数中使用this,只需在结尾处调用.call(this)即可。

(function () {
    "use strict";

    this.foo = "bar";
}).call(this);