90

javascriptを厳密モードで使用すると、匿名関数が未定義になるのはなぜですか? これが理にかなっている理由は理解できますが、具体的な答えは見つかりませんでした。

例:

(function () {
    "use strict";

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

フィドルでテストします: http://jsfiddle.net/Pyr5g/1/ ロガー (firebug) をチェックしてください。

4

3 に答える 3

110

ECMAscript 262 エディション 5 までは、 を使用している人がキーワードconstructor patternを使用するのを忘れると、大きな混乱が生じたからです。ES3 でコンストラクター関数を呼び出すときnewに使用するのを忘れた場合、 (ブラウザーで) グローバル オブジェクトを参照し、グローバル オブジェクトを変数で上書きします。newthiswindow

これはひどい振る舞いだったので、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 strict でエラーをスローします

"TypeError: this is undefined"

(これははるかに優れた動作です)

于 2012-03-22T12:50:56.380 に答える
15

this呼び出された関数のコンテキストに入る前にオブジェクトをラップまたは変更する「ボクシング」と呼ばれるメカニズムがあります。あなたの場合、関数をオブジェクトのメソッドとして呼び出していないため、値は であるthis必要があります。undefined非厳密モードの場合、この場合、これはwindowオブジェクトに置き換えられます。モードではstrict常に変更されないため、undefinedここに表示されます。

詳細については、
https://developer.mozilla.org/en/JavaScript/Strict_modeを参照してください。

于 2012-03-22T13:00:07.477 に答える