次のコード スニペットを検討してください。
var global = (function(){
return this;
}());
window
これが実行されると、グローバルはブラウザ内のオブジェクト
を指します。
しかし、これは厳密モードでは機能しません。なんで?
次のコード スニペットを検討してください。
var global = (function(){
return this;
}());
window
これが実行されると、グローバルはブラウザ内のオブジェクト
を指します。
しかし、これは厳密モードでは機能しません。なんで?
ES5 仕様では、間接評価を通じてグローバル オブジェクトを取得できます。
var global = (0, eval)('this');
これは、厳密モードと非厳密モードの両方で機能します。
間接 eval は基本的に、参照ではなく値によって行われる eval の呼び出しです (または、値バインディングの名前が「eval」ではない場合)。間接評価はグローバル スコープで実行され、グローバル スコープでthis
はグローバル オブジェクトを参照します。
これをカバーする詳細な記事があります: http://perfectionkills.com/global-eval-what-are-the-options/
その理由はdystroyによってすでに説明されています:this
厳密モードではグローバルオブジェクトにはなりません。回避策は次のとおりです(グローバルスコープで実行されていると仮定)。
var global = (function(g){
return g;
}(this));
ES5仕様によると、その理由は次のとおりです。
this
がstrictモードコード内で評価される場合、this
値はオブジェクトに強制変換されません。のthis
値null
またはundefined
グローバルオブジェクトに変換されない
MDNから:
for a strict mode function, the specified this is used unchanged:
...
"use strict";
function fun() { return this; }
assert(fun() === undefined);
したがって、これは指定どおりです。