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

时间:2014-08-14 08:51:59

标签: 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 });

我认为关闭只是&#34;编译&#34;一次又重复使用,所以实际执行性能相同。我的一个同事认为关闭是一次又一次地创造的,它会伤害表现。

任何人都可以解释什么是首选方法?

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

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

我发现这比使用全局访问器函数更具可读性,所以我更倾向于内联访问器。

1 个答案:

答案 0 :(得分:1)

我的同事认为关闭是一遍又一遍地创造的

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

  

并且会伤害表现。

不太可能。如果你真的在乎,请测量它。实例化可能比调用循环便宜得多。

  

我认为关闭只是&#34;编译&#34;曾经一遍又一遍地重复使用

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

  

因此实际执行性能相同。

在单个电话中,是的。