javascript 中的 eval() 关键字究竟如何破坏编译器优化
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 行;该变量也将在执行阶段由引擎(在全局范围内)创建。我认为这不等于 'cheating' 词法范围。那么本质上做类似事情的 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 回复或某种形式,那么同样适用用户输入? 不总是。并且优化始终需要 SURE 他们假设要减少最终代码的事情。
function func1(str) {
eval(str);
newVar = 100;
function func2() {
console.log(bar);
console.log(newVar);
}
func2();
}
func1("bar = 42;");
我读到应该避免使用 eval() 关键字,因为它会欺骗词法范围(这会导致代码 运行 变慢)。在上述示例(或任何其他示例)的上下文中,我试图了解这可能最终会破坏什么样的编译器优化。
查看 newVar = 100 行;该变量也将在执行阶段由引擎(在全局范围内)创建。我认为这不等于 'cheating' 词法范围。那么本质上做类似事情的 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 回复或某种形式,那么同样适用用户输入? 不总是。并且优化始终需要 SURE 他们假设要减少最终代码的事情。