eval()能够更改局部变量,这对JavaScript优化器来说是个问题。
我读过javascript权威指南书。
eval()可以优化?我不明白。
答案 0 :(得分:6)
这不是 eval
优化的,因为它接受字符串而不能进行静态分析,因此eval
阻止了寻求优化的JavaScript引擎。关于它可能执行的代码。
考虑这个功能:
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引擎的优化器投入了一个伟大的大扳手,有效地使它必须关闭它。