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 回答