JavaScript:闭包和全局函数之间的开销比较

标签 javascript performance closures

我想知道 JavaScript 闭包的开销。假设我有以下功能:

function sum(arr, sumMethod) {
  var totalSize = 0;
  for (index = 0; index < arr.length; ++index) {
    totalSize += sumMethod(arr[index]);
  }
  return totalSize;
}

如果我想知道所有传输的总大小,那么我可以使用全局访问器函数来获取传输的大小。该函数被传递给 sum:

// Use a "global" method that is initialize only once
function getTransferSize(transfer) { return transfer.size };

...

// Obtain the total size of all transfers (called pretty often)
var totalTransferSize = sum(transfers, getTransferSize);

另一种方法是像这样内联访问器:

// Obtain the total size of all transfers (called pretty often)
var totalTransferSize = sum(transfers, function (transfer) { return transfer.size });

我认为闭包仅“编译”一次并一遍又一遍地重用,因此实际的执行性能将是相同的。我的一位同事认为,一次又一次地创建闭包会损害性能。

谁能解释一下首选方法是什么?

备注:我实际上使用的是 CoffeeScript,它使闭包更具可读性。在 CoffeeScript 中,代码如下所示:

totalTransferSize = sum transfers, (t) -> t.size

我发现这比使用全局访问器函数更具可读性,因此我更喜欢内联访问器。

最佳答案

我的一位同事认为闭包是一遍又一遍地创建的

是的。每次计算函数表达式时,都会实例化一个新的函数对象。

and it hurts performance.

不太可能。如果你真的很在意,就测量一下。实例化可能比调用循环便宜得多。

I would think the closure is only "compiled" once and reused over and over again

是的,代码仅编译一次并由所有函数实例共享。

so the actual execution performance would be equal.

对于单个调用,是的。

关于JavaScript:闭包和全局函数之间的开销比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25303925/

相关文章:

javascript - JavaScript 中的一个参数强制使用两个值?

javascript - JS 函数不返回 return

ruby - 为什么尾递归 gcd 比 rubinius 的 while 循环更快

javascript - 如何在JS中制作一个函数

performance - MongoDB C# 游标性能问题

Sql通配符: performance overhead?

javascript - 确切的关闭是什么?

rust - 为什么调用 FnOnce 关闭是一个 Action ?

javascript - 在我的内容脚本中调用 JS 库 - WebExtension

javascript - YouTube Flash/HTML5播放器