在严格模式下使用javascript时,为什么在匿名函数中未定义此函数?我知道为什么这样做有意义,但是我找不到任何具体答案。
例:
(function () {
"use strict";
this.foo = "bar"; // *this* is undefined, why?
}());
在小提琴中测试:http : //jsfiddle.net/Pyr5g/1/ 检查记录器(firebug)。
在严格模式下使用javascript时,为什么在匿名函数中未定义此函数?我知道为什么这样做有意义,但是我找不到任何具体答案。
例:
(function () {
"use strict";
this.foo = "bar"; // *this* is undefined, why?
}());
在小提琴中测试:http : //jsfiddle.net/Pyr5g/1/ 检查记录器(firebug)。
Answers:
这是因为,在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 === window
令人困惑,并且将全局范围作为令牌泄漏给函数
有一种称为“装箱”的机制,该机制this
在进入被调用函数的上下文之前包装或更改对象。在您的情况下,值this
应该是undefined
因为您没有将函数作为对象的方法来调用。如果是非严格模式,在这种情况下,将由window
对象替换。在strict
模式下,它始终不变,这就是为什么它在undefined
这里。
您可以在https://developer.mozilla.org/en/JavaScript/Strict_mode中找到更多信息。
根据This Stack Overflow的答案,您可以this
在内部匿名函数中使用,只需.call(this)
在其末尾调用即可。
(function () {
"use strict";
this.foo = "bar";
}).call(this);
this
将是Window
目标,这可能不是您所希望的