Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么是;这";在匿名函数中使用strict时未定义?_Javascript_Anonymous Function_Use Strict - Fatal编程技术网

Javascript 为什么是;这";在匿名函数中使用strict时未定义?

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

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

例如:

(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那么我们如何在严格模式下为窗口对象分配变量??