我想知道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
我发现这比使用全局访问器函数更具可读性,所以我更倾向于内联访问器。
答案 0 :(得分:1)
我的同事认为关闭是一遍又一遍地创造的
是。每次计算函数表达式时,都会实例化一个新的函数对象。
并且会伤害表现。
不太可能。如果你真的在乎,请测量它。实例化可能比调用循环便宜得多。
我认为关闭只是&#34;编译&#34;曾经一遍又一遍地重复使用
是的,代码只编译一次并由所有函数实例共享。
因此实际执行性能相同。
在单个电话中,是的。