我想知道 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/