代わりに、eval をグローバル スコープで実行することができます。
eval(s)
ただ使う
window.eval(s);
また
var e=eval; e(s);
また
[eval][0](s)
これは驚くべきことに、Javascript が奇妙で、文字列を評価するためeval
に元のオブジェクトを直接使用している場合、現在のコンテキストで評価が行われるという特別な規則があるためです。eval
代わりに「間接評価」が使用される場合 (つまり、変数に格納eval
してから変数を使用する場合、またはオブジェクトeval
を使用してアクセスする場合でもwindow
)、評価はグローバル コンテキストで行われます。
これは Javascript コンソールで確認できます。
function foo() {
eval("function square(x){ return x*x; }");
}
function bar() {
window.eval("function square(x){ return x*x; }");
}
foo()
square(12) // <-- this gives an error; direct evaluation was used
bar()
square(12) // <-- this returns 144
Soはifwindow.eval(s)
と同じではありません。eval(s)
window.eval === eval
PS
eval
これが発生するための特別な特定の言語ルールがあることに注意してください。
x
メソッドが定義されたオブジェクトがあるm
場合
x.m()
と同じではありません
var mm = x.m; mm();
最初のケースではコードの実行中this
にバインドされ、2 番目のケースではグローバル オブジェクトになるためです。x
m
this
なのでこの場合も ifx.m()
とは違います。mm()
x.m === mm
同じ理由で、は と同じx.m()
ではありません[x.m][0]()
。後者でthis
は、メソッド コードの実行中に にバインドされるのではなく、配列オブジェクトにバインドされるからx
です。