3

eval() 改变局部变量的能力对 JavaScript 优化器来说非常有问题。

我读了这本书 javascript Definitive Guide。

eval() 可以优化??我不明白。

4

1 回答 1

8

这不是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出现的代码。

于 2013-03-16T09:12:43.037 回答