eval() 更改局部变量的能力给 JavaScript 优化器带来了很大的问题。
我读了《javascript权威指南》这本书。
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
出现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)