1. ホーム
  2. javascript

[解決済み] strictを使用すると、なぜ無名関数の "this "は未定義になるのですか?

2023-04-15 08:02:49

質問

なぜ この は無名関数では未定義なのでしょうか?私はこれが意味を持ち得る理由を理解していますが、私は具体的な答えを見つけることができませんでした。

例です。

(function () {
    "use strict";

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

フィドルでテストする。 http://jsfiddle.net/Pyr5g/1/ ロガー(firebug)で確認する。

どのように解決するのですか?

ECMAscript 262 第 5 版まで、ECMAscript 262 で使用されている constructor pattern を使っている人が new というキーワードがあります。を使い忘れた場合 new を使うと、ES3 でコンストラクタ関数を呼び出すときに this はグローバルオブジェクトを参照していました ( window を参照し、変数でグローバルオブジェクトを破壊することになります。

これはひどい動作なので、ECMA の人々は、単に thisundefined .

例です。

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"

(これはより良い動作です)