2

厳密モードを使用すると、次のコードは機能しません。this.bar = 'foobar'; で失敗します。ライン。これはなぜですか?厳密モードでオブジェクト プロパティを作成するにはどうすればよいですか?

<html>
<body>
<script>
"use strict";
var foo = (function () {
    this.bar = 'foobar';
    return this;
}());
alert(foo.bar);
</script>
</body>
</html>

編集: 問題を指摘してくれた James Allardice に感謝します。自己実行関数がオブジェクトを作成していると誤って考えていましたが、そうではありません。代わりに、次のいずれかを行う必要がありました。

"use strict";
var foo = new function () {
    this.bar = 'foobar';
};
alert(foo.bar);

または(これはJSLintの方が好きです)

"use strict";
var foo = (function () {
    var obj = {};
    obj.bar = 'foobar';
    return obj;
}());
alert(foo.bar);
4

1 に答える 1

3

厳密モードでthisは、ウィンドウを参照しません。あなたの例では、厳格なモード ディレクティブを削除すると、thiswindow が参照されます。

厳密モードでthisは、あなたの例はundefinedであるため、エラーが発生します。これは、あるものにプロパティを設定できないためですundefined

MDNから(状況に関連する部分を強調):

まず、strict モードの関数に this として渡される値は、オブジェクトにボックス化されません。通常の functionの場合、これは常にオブジェクトです。オブジェクト値の this で呼び出された場合は、提供されたオブジェクト。ブール値、文字列、または数値で呼び出された場合はボックス化された値。グローバルオブジェクトは、undefined または null で呼び出された場合はこれ... 自動ボックス化はパフォーマンスコストですが、グローバルオブジェクトは JavaScript 環境が制限しなければならない機能へのアクセスを提供するため、グローバルオブジェクトをブラウザーに公開することはセキュリティ上の危険です。したがって、厳密モード関数の場合、指定された this は変更されずに使用されます

于 2012-06-12T15:04:37.587 に答える