Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:闭包和全局函数之间的开销比较_Javascript_Performance_Closures - Fatal编程技术网

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

JavaScript:闭包和全局函数之间的开销比较,javascript,performance,closures,Javascript,Performance,Closures,我想知道JavaScript闭包的开销。假设我有以下函数: function sum(arr, sumMethod) { var totalSize = 0; for (index = 0; index < arr.length; ++index) { totalSize += sumMethod(arr[index]); } return totalSize; } 另一种方法是像这样内联访问器: // Obtain the total size of all t

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

function sum(arr, sumMethod) {
  var totalSize = 0;
  for (index = 0; index < arr.length; ++index) {
    totalSize += sumMethod(arr[index]);
  }
  return totalSize;
}
另一种方法是像这样内联访问器:

// Obtain the total size of all transfers (called pretty often)
var totalTransferSize = sum(transfers, function (transfer) { return transfer.size });
totalTransferSize = sum transfers, (t) -> t.size
我认为闭包只被“编译”一次,并被反复重用,因此实际执行性能是相等的。我的一个同事认为闭包是一次又一次地创建的,它会影响性能

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

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

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

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

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

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

这会影响性能

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

我认为闭包只是“编译”了一次,并反复重复使用

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

因此,实际执行性能是相等的


对于单个调用,是的。

代码只编译了一次,但函数表达式将创建多个函数对象。因此垃圾收集将更加繁忙。但另一个会一直保持记忆直到时代结束。并不是说会有很多记忆…是的。它只是创建一个全局变量来保存一个值,或者每次需要从一个文本表达式中创建一个值。几乎不可测量,如果在所有-编译器甚至可能优化一个案例到另一个。