Javascript 为什么是;这";在匿名函数中使用strict时未定义?
为什么在严格模式下使用javascript时,匿名函数中的未定义此?我理解为什么这是有道理的,但我找不到任何具体的答案 例如:Javascript 为什么是;这";在匿名函数中使用strict时未定义?,javascript,anonymous-function,use-strict,Javascript,Anonymous Function,Use Strict,为什么在严格模式下使用javascript时,匿名函数中的未定义此?我理解为什么这是有道理的,但我找不到任何具体的答案 例如: (function () { "use strict"; this.foo = "bar"; // *this* is undefined, why? }()); function myConstructor() { this.a = 'foo'; this.b = 'bar'; } myInstance = new myC
(function () {
"use strict";
this.foo = "bar"; // *this* is undefined, why?
}());
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
小提琴测试:
查看日志(firebug)。这是因为,在ECMAscript 262第5版之前,如果使用
构造函数模式的人忘记使用new
关键字,就会产生很大的混乱。如果在ES3中调用构造函数时忘记使用new
,此
引用了全局对象(浏览器中的窗口
),您将使用变量关闭全局对象
这是一种可怕的行为,因此ECMA的人员决定,只需将this
设置为undefined
例如:
(function () {
"use strict";
this.foo = "bar"; // *this* is undefined, why?
}());
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
的值应该是undefined
,因为您没有将函数作为对象的方法调用。
如果是非严格模式,在这种情况下,将由窗口
对象替换。
在严格
模式下,它始终保持不变,这就是为什么它在这里是未定义的
您可以在
根据,您可以在匿名函数中使用this
,只需在其末尾调用。调用(this)
(function () {
"use strict";
this.foo = "bar";
}).call(this);
这是有道理的。你有证据支持这一说法吗?@RobW:我必须搜索自己,但我多次听到Douglas Crockford说,这就是做出这一决定的原因。JavaScript中提到了这一点:Crockford的好部分。对其进行了详细描述。不过,与ECMAs决策无关。这就是为什么严格模式将其默认为未定义的逻辑原因。另一个逻辑原因是效率,另一个逻辑原因是this===window
容易混淆,并将全局范围作为令牌泄漏到functions@jAndy:谢谢你的回答。这是有道理的。我还在上找到了对此更改的简洁解释:“最值得注意的是,如果要调用或应用的第一个参数为null或未定义,则被调用函数的this值将不会转换为全局对象。”请注意,这与匿名函数无关,与调用方法无关。请参阅(查看控制台日志)。@Phrogz:这可能是一些混乱的原因。感谢您指出这一点。请注意,在这种情况下,这个
将是窗口
对象,这可能不是我们想要的。这个答案并不能解释所问的问题。@samuel那么我们如何在严格模式下为窗口对象分配变量??