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);
编辑:其实,让我们更深入。在上面的代码中,没有任何状态bar
会在到达console.log(bar);
部分代码时被定义。而且它永远是数字。实际上,它始终是42。假设引擎具有完善的优化算法,如果所评估代码的输入是动态的(例如来自AJAX答复或某种形式的用户输入),这是否同样适用?并非总是如此。和优化总是需要SURE他们承担削减最终代码的东西。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句