【问题标题】:Performance of Variables in a Closure versus as Function Arguments闭包中变量的性能与作为函数参数的性能
【发布时间】:2013-09-09 06:05:35
【问题描述】:

有人知道通过函数参数传入变量与通过闭包获得变量的优化效果吗?似乎通过函数参数传递变量会更快,因为对象是通过引用复制的(复制时间如此之快)并且攀登函数的范围环境需要检查每个级别的环境。这是我的意思的要点

a = 5;
b = function() {
  alert(a);
}
b();

a = 5;
b = function(c) {
  alert(c);
}
b(a);

理论上哪个性能更快?

【问题讨论】:

  • 比什么更快?依据什么标准? ECMA-262 没有定义实现,所以理论上两者都不是更快。标识符必须在作用域链上解析,无论它们属于哪个执行上下文,因此理论上应该更快地解析局部变量。但与直觉相反,众所周知,全局变量在某些环境中更快。所以“测试会告诉你”和“期望在不同的浏览器中得到不同的结果”适用。
  • 但它们不可互换...第一个函数依赖于a 而第二个不依赖于,因此您可以在不同的情况下使用它们。
  • @elclanrs——我理解这个问题是解决局部变量还是解析范围链上的父变量(通过闭包建立)是否更快。
  • jsperf.com/scope-vs-passed-test123123 测试似乎表明速度因浏览器而异。然而,当涉及到 js 垃圾收集器时,我会对内存使用差异和最终浏览器性能更感兴趣。我对此有一个稍微相关的问题:stackoverflow.com/q/20673056/1647538
  • 你能解释一下使用闭包相对于函数参数有什么好处吗?

标签: javascript scope


【解决方案1】:

不久前我也有同样的问题,所以我一起拍了a quick'n'dirty benchmark。似乎大多数流行的浏览器(令人惊讶地)更喜欢在范围内查找(FF24 非常如此)。

我希望这能回答你的问题。

【讨论】:

  • 差别似乎不大,不过这种参考还是不错的(至少说明差别不大)。对我来说,在 i686 上使用 Opera 12.16,“通过”会快一点。
  • jsPerf 已经关闭了一段时间。有机会,你可以提供代码吗?
【解决方案2】:

爬取函数的作用域环境需要检查每一层的环境

仅在理论上。事实上,由于作用域链不是动态的,因此可以并将其优化为静态引用。

通过函数参数传递变量会更快,因为对象是通过引用复制的(复制时间如此之快)

即使速度非常快,它们仍然需要被复制。该函数需要为它们分配额外的内存,而对闭包的引用则不是这样。


如果你可以在闭包范围内放置一个值,那就去做吧。这只是实用的,你想建立一个闭包。如果您不想并且不需要函数中的可变参数,请使用参数。使用更易读的替代方案。

【讨论】:

    【解决方案3】:

    这一切都取决于。除非将来有大问题,否则不要担心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-27
      • 1970-01-01
      • 2017-04-12
      • 2021-07-27
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 2011-01-26
      相关资源
      最近更新 更多