eval() 关键字究竟是如何破坏 JavaScript 中的编译器优化的
how exactly does eval() keyword break compiler optimizations in javascript
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 回复或某种形式的用户输入,情况是否也是如此?并非总是如此。优化总是需要确定他们假设的事情,以减少最终代码。
相关文章:
- 当使用extern和目标JavaScript时,我如何强制Haxe编译器使用require语句
- 如何告诉闭包javascript编译器不要混淆webkitAudioContext的方法名称
- 在哪里可以找到R-to-JavaScript编译器
- 无法使用 ant 和闭包编译器编译 javascript,因为 Jquery 的 $ 是未声明的
- TypeScript 编译器在 WebStorm 中创建空的 JavaScript 文件
- C语言的Javascript编译器
- 如何在JavaScript中为Google闭包编译器设置参数类型
- 闭包编译器高级和服务器端注入的Javascript
- eval() 关键字究竟是如何破坏 JavaScript 中的编译器优化的
- 使用闭包编译器编写更好的面向对象JavaScript完整示例代码
- 在javascript中的即时Java编译器
- 如何使用闭包编译器在 javascript 中注释扩展泛型类型的类
- ChickenScheme Spock JavaScript编译器安装问题
- 什么是编译器?如何制作一个简单的ruby到javascript编译器
- javascript编译器中的死代码
- 准备脚本在JavaScript编译器中编译(Google Closure)
- 是否有一个独立的JavaScript编译器/解释器与控制台,我可以用它来练习浏览器之外的JavaScript
- c -我如何为Arduino或类似的微控制器编写JavaScript编译器
- ECMAScript:Harmony/ES6到JavaScript编译器
- 什么是最生产级别的Haskell到JavaScript编译器,编写在浏览器中运行的代码