Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

eval对作用域性能的干扰

  之前的文章中说过不同方法执行代码的效率问题,实验表明全局eval执行代码并不会影响被执行代码的效率。但是eval还有局部模式,这和with语句一样存在问题。局部eval就不仅会影响自身所在作用域的变量访问速度,甚至还会影响到整个祖先级的作用域链。
  由于局部eval所允许执行的代码可能对作用域造成影响,比如创建堆变量之类的。这造成了包含eval的作用域,无法实现某些优化,导致了执行效率的下降。
<script>
(function(){
  var i,t=new Date;
  for(i=0;i<1E8;i++);
  console.log("正常环境:"+(new Date-t));
})();

(function(){
  eval("/*呜呜呜,我明明什么都没做*/");
  var i,t=new Date;
  for(i=0;i<1E8;i++);
  console.log("eval影响:"+(new Date-t));
})();
</script>

  那么,把这个eval用个匿名函数套起来呢?
<script>
(function(){
  (function(){
    (function(){
      (function(/*我是套套*/){
        eval("/*我是冤枉的啊,我真的什么都没做*/");
      })();
      var i,t=new Date;
      for(i=0;i<1E8;i++);
      console.log(new Date-t);
    })();
    var i,t=new Date;
    for(i=0;i<1E8;i++);
    console.log(new Date-t);
  })();
  var i,t=new Date;
  for(i=0;i<1E8;i++);
  console.log(new Date-t);
})();
</script>
  但是浏览器们并不吃这一套!eval所在的作用域不仅会影响它自己,还会坑爹、坑长辈,所有祖辈作用域都被他坑了。那么它坑后代吗?
<script>
(function(){
  eval("/*我是冤枉的啊,我真的什么都没做*/");
  (function(){
    (function(){
      var i,t=new Date;
      for(i=0;i<1E8;i++);
      console.log(new Date-t);
    })();
    var i,t=new Date;
    for(i=0;i<1E8;i++);
    console.log(new Date-t);
  })();
})();
</script>

  在IE和Firefox中它是不坑后代的,但是Chrome在此处傲了个娇,后代也被它坑了。要解决的话只能考虑把eval部分套起来,让它没有后代。不过总而言之,我建议在使用局部eval时尽可能的把它和其它作用域隔离开,比如放入一个在全局作用域声明的单独函数中,用参数和返回值操作它。 <script>
(function(f){
  (function(){
    f();
    var i,t=new Date;
    for(i=0;i<1E8;i++);
    console.log(new Date-t);
  })();
})(function(){
  eval("/*嘻嘻,我不影响性能哟*/");
});
</script>
网名:
3.80.55.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^