間違っていたら教えて下さい。
直接eval
var func = function () {
var temp = 100;
eval('(function () { console.log(temp); })()');
};
func();
このコードが何を表しているのかというと、eval
は文字からプログラムのコードを解析して実行するという話にとどまらず、func関数リテラルのローカルスコープに対してアクセスできているということです。
これが結構重要で、jsのコードを半コンパイルするV8エンジンなんかはeval
が使われてたら困るわけですね。
だからeval
が使われてる時点で関数の実行速度に影響が出ると言われてます。
このような使い方をするeval
は"直接eval"とか言われてます。
間接eval
間接evalはこんな書き方をします。
var func = function () {
var temp = 100;
(0, eval)('(function () { console.log(temp); })()');
};
func();
これを実行したらtempが無いって怒られます。
func関数リテラルのローカルスコープにアクセスさせない書き方です。
この書き方なら実効速度にさほど影響は与えないと言われてます。
じゃあどこのスコープにアクセスしているのかというと、グローバルスコープです。
var func = function () {
window.temp = 100;
(0, eval)('(function () { console.log(temp); })()');
};
func();