为什么在严格模式下使用 javascript 时匿名函数中的this未定义?我明白为什么这可能有意义,但我找不到任何具体的答案。
例子:
(function () {
"use strict";
this.foo = "bar"; // *this* is undefined, why?
}());
在小提琴中测试:http : //jsfiddle.net/Pyr5g/1/ 查看记录器(萤火虫)。
为什么在严格模式下使用 javascript 时匿名函数中的this未定义?我明白为什么这可能有意义,但我找不到任何具体的答案。
例子:
(function () {
"use strict";
this.foo = "bar"; // *this* is undefined, why?
}());
在小提琴中测试:http : //jsfiddle.net/Pyr5g/1/ 查看记录器(萤火虫)。
这是因为,直到 ECMAscript 262 第 5 版,如果使用constructor pattern
, 的人忘记使用new
关键字,就会产生很大的混乱。如果您new
在 ES3 中调用构造函数时忘记使用,this
引用全局对象(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"
(这是一个更好的行为)
有一种称为“装箱”的机制,它this
在进入被调用函数的上下文之前包装或更改对象。在您的情况下,值this
应该是undefined
因为您没有将该函数作为对象的方法调用。如果是非严格模式,在这种情况下, this 被window
对象替换。在strict
模式下它总是不变的,这就是它在undefined
这里的原因。
您可以在https://developer.mozilla.org/en/JavaScript/Strict_mode找到更多信息
根据This Stack Overflow answer,您可以使用this
内部匿名函数,只需.call(this)
在其末尾调用即可。
(function () {
"use strict";
this.foo = "bar";
}).call(this);