LoginSignup
30
29

More than 5 years have passed since last update.

evalって2種類あることを知らない人へ

Posted at

間違っていたら教えて下さい。

直接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();
30
29
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
29