eval() 关键字究竟是如何破坏 JavaScript 中的编译器优化的

how exactly does eval() keyword break compiler optimizations in javascript

本文关键字:JavaScript 编译器 优化 何破坏 关键字 究竟 eval      更新时间:2023-09-26
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;"( 本质上做类似的事情有什么问题?希望问题清楚。

因为它们

编译器优化,并且传递给 eval 的代码几乎是强制性的解释。

在您的情况下,现代引擎可能足够智能,可以意识到它是一个字符串文字并相应地进行优化,但仍然会创建新的执行上下文,并且您浪费了函数调用。一个普通程序使用eval所做的几乎每一件事都可以在没有eval的情况下完成。

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

编辑:实际上,让我们更深入。在上面的代码中,当到达代码的console.log(bar);部分时,不存在未定义bar的可能状态。它永远是一个数字。实际上,它总是 42。假设引擎具有完美的优化算法,如果来自 eval'd 代码的输入是动态的,例如,来自 AJAX 回复或某种形式的用户输入,情况是否也是如此?并非总是如此。优化总是需要确定他们假设的事情,以减少最终代码。