eval() 可以优化吗?

Posted

技术标签:

【中文标题】eval() 可以优化吗?【英文标题】:Can eval() optimize? 【发布时间】:2013-03-05 01:25:55 【问题描述】:

eval() 改变局部变量的能力给 javascript 优化器带来了很大的问题。

我阅读了 javascript Definitive Guide 一书。

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

【问题讨论】:

没有。它阻碍优化器。 在这种情况下这可能是一个有趣的阅读:blog.mozilla.org/luke/2012/10/02/…。 非常感谢!!我会努力阅读的!(如果我的英文写得不好,我很抱歉) 【参考方案1】:

不是 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 的代码的优化器。

【讨论】:

感谢您的帮助!!! .我开始学英语了。我英语写得不好。 :) 非常感谢。 @user2047350:不客气,很高兴有帮助。我没有任何问题理解你的问题,你的英语很好。 :-)

以上是关于eval() 可以优化吗?的主要内容,如果未能解决你的问题,请参考以下文章

eval() 可以优化吗?

react首屏页面加载性能优化记录

“safe_eval”真的安全吗?

微信小程序不支持eval和JSON.parse等函数吗?

如何使用 XGboost 针对不同的“eval_metric”优化 sklearn 管道?

Redis使用Lua的一些优化和注意事项