eval() 改变局部变量的能力对 JavaScript 优化器来说非常有问题。
我读了这本书 javascript Definitive Guide。
eval() 可以优化??我不明白。
eval() 改变局部变量的能力对 JavaScript 优化器来说非常有问题。
我读了这本书 javascript Definitive Guide。
eval() 可以优化??我不明白。
这不是eval
优化,而是希望优化的 JavaScript 引擎无法这样做eval
,因为它接受一个字符串,并且它们无法对其可能执行的代码进行静态分析。
考虑这个函数:
function foo(str) {
var a = getAReallyBigArray();
doSomethingWith(a);
document.getElementById("foo").addEventListener('click', function() {
alert(str);
}, false);
}
根据规范,事件处理函数具有对a
变量的引用(通过执行上下文的词法环境对象),因此只要该事件处理程序存在,数组就会一直保存在内存中。但是 JavaScript 引擎可以分析事件处理程序并确定它肯定没有引用a
,从而优化变量绑定对象的内容并让数组得到垃圾收集。
但是在那里扔一个eval
:
function foo(str) {
var a = getAReallyBigArray();
doSomethingWith(a);
document.getElementById("foo").addEventListener('click', function() {
eval(str);
}, false);
}
现在,JavaScript 引擎不可能优化词法环境对象的内容,因此它必须将大数组保留在内存中,以防str
其中有代码访问它。
这只是一个具体的例子。最基本的一点是,这eval
给 JavaScript 引擎的优化器带来了很大的麻烦,有效地使引擎关闭了它的优化器来处理eval
出现的代码。