MDNから:
これの価値は楽しみへの呼びかけに提供されました。これは、メソッドによって表示される実際の値ではない可能性があることに注意してください。メソッドが非厳密モード コードの関数である場合、null および undefined はグローバル オブジェクトに置き換えられ、プリミティブ値はボックス化されます。
グローバル オブジェクトは window です。
null、未定義、または eval を持つオブジェクトを渡すかどうかは問題ではないため、編集してください。内部eval
は、eval 呼び出しの直前this
と同じになります。this
ECMA-262 5.1 のセクション 15.1.2.1 に従って、eval は文字列を受け取り、それを ECMAscript として解析します。有効な ECMAscript である場合は、呼び出し元のコンテキストで実行されます。したがって、あなたの場合、 eval への呼び出しはconsole.log(this)
、実行時に自分自身を置き換えるかのように考えることができます。その置換により、プログラムは次のようになります。
var stringToEval = "console.log(this)";
console.log(this);
console.log(this);
これにより、DOMWindow
オブジェクトを 2 回出力する理由が明確になります。次のように回避できます。
var stringToEval = "console.log(this)";
(function(str){ eval(str); }).call({not: "empty"}, stringToEval);
(function(str){ eval(str); }).apply({not: "empty"}, [stringToEval]);
eval がそれ自体を置き換えると、渡されたオブジェクトを参照するconsole.log(this)
無名関数のコンテキストになります。this
この JSFiddle を参照してください