3

次のコード スニペットを検討してください。

var global = (function(){
    return this;
}());

windowこれが実行されると、グローバルはブラウザ内のオブジェクト を指します。
しかし、これは厳密モードでは機能しません。なんで?

4

3 に答える 3

10

ES5 仕様では、間接評価を通じてグローバル オブジェクトを取得できます。

var global = (0, eval)('this');

これは、厳密モードと非厳密モードの両方で機能します。

間接 eval は基本的に、参照ではなく値によって行われる eval の呼び出しです (または、値バインディングの名前が「eval」ではない場合)。間接評価はグローバル スコープで実行され、グローバル スコープでthisはグローバル オブジェクトを参照します。

これをカバーする詳細な記事があります: http://perfectionkills.com/global-eval-what-are-the-options/

于 2013-01-17T19:55:50.720 に答える
4

その理由はdystroyによってすでに説明されています:this厳密モードではグローバルオブジェクトにはなりません。回避策は次のとおりです(グローバルスコープで実行されていると仮定)。

var global = (function(g){
    return g;
}(this));

ES5仕様によると、その理由は次のとおりです。

thisがstrictモードコード内で評価される場合、this値はオブジェクトに強制変換されません。のthisnullまたはundefinedグローバルオブジェクトに変換されない

于 2013-01-17T17:33:32.543 に答える
1

MDNから:

for a strict mode function, the specified this is used unchanged:
...
"use strict";
function fun() { return this; }
assert(fun() === undefined);

したがって、これは指定どおりです。

于 2013-01-17T17:31:23.763 に答える