1
function func1(str) {
  eval(str);
  newVar = 100;
  function func2() {
     console.log(bar);
     console.log(newVar);
  }
  func2();
}

func1("bar = 42;");

eval() キーワードはレキシカル スコープをだますため (コードの実行が遅くなる)、避けるべきであると読みました。上記の例 (または誰かが持っている他の例) のコンテキストで、これがどのような種類のコンパイラの最適化を壊す可能性があるかを理解しようとしています。

行 newVar = 100; を見ると、この変数も、実行フェーズ中にエンジンによって (グローバル スコープで) 作成されます。これがレキシカルスコープを「ごまかす」ことになるとは思いません。次に、本質的に同様のことを行う eval("bar = 42;") の問題は何ですか? 質問が明確であることを願っています。

4

1 に答える 1

2

それらはコンパイラの最適化であり、 eval に渡されるコードはほとんど義務的に解釈されるためです。

あなたの場合、最新のエンジンはおそらくそれが文字列リテラルであることを認識し、それに応じて最適化するのに十分スマートですが、新しい実行コンテキストが作成され、関数呼び出しが無駄になります。通常のプログラムが eval を使用して行うほとんどすべてのことは、evalなしで行うことができます。

function func1(value)
{
  var bar = value;
  var newVar = 100;
  function func2() {
     console.log(bar);
     console.log(newVar);
  }
  func2();
}

func1(42);

編集:実際には、もっと深く行きましょう。上記のコードでは、コードの一部に到達したbarときに未定義になる可能性のある状態はありません。console.log(bar);そして、それは常に数値になります。実際には、常に 42 になります。エンジンが完全な最適化アルゴリズムを備えていると仮定すると、eval されたコードからの入力が動的である場合 (たとえば、AJAX 応答または何らかの形式のユーザー入力から来る場合) に同じことが当てはまりますか? いつもではありません。また、最適化では、最終的なコードを削減するために想定されることを常に確認する必要があります。

于 2016-03-26T02:51:43.070 に答える