在循环中使用Array.prototype.forEach可以吗?

时间:2014-03-04 18:06:06

标签: javascript foreach jshint

JSHint向我抱怨,因为我正在使用for(o in ...)循环一个对象,然后在里面使用o.somearray.forEach(function(){...});。它是说不在循环中创建函数,但在这种情况下甚至是否重要?它看起来更好一点,因为线条较少而且看起来(略微)更好,但它有什么重大影响吗?

使用正常的for循环并迭代数组是否更好,或者创建函数并使用ECMA 5版本是否正常?

我正在做这样的事情:

for(var i in data) {
   data[i].arr.forEach(function(...) {
      // do magic
   });
}

2 个答案:

答案 0 :(得分:3)

使用forEach很好,这里建议的是你传递给forEach的函数应该在循环之外创建,如下所示:

var doMagic = function(...) {
    // do magic
};
for (var i in data) {
    data[i].arr.forEach(doMagic);
}

不鼓励在循环中创建函数,因为它效率低,JavaScript解释器将在每次循环迭代中创建函数的实例。其他详细信息在JSLint Error Explanations: Don't make functions within a loop

中提供

答案 1 :(得分:1)

是的,嵌套构造很好。每个循环创建一个“新”函数也没关系。和,

相同执行上下文中创建许多“新”函数时的性能差异是一个实现细节;但它本来就慢。(见jsperf test case 1

即使在“新”情况下创建 new 函数对象,每个循环也会创建相同个执行上下文 - 即当前执行上下文并且当调用该函数时。更智能的JavaScript实现可以轻而易举地利用这一点;或者他们可能没有。

在这种特殊情况下,我更喜欢内联方法。


1 当然测试特定的 JavaScript实现;

  • 在IE 10中,Chrome 33和FF 23显示相同的性能
  • FF 27赞成“新”功能案例
  • Safari 5窃听数字,而在“新”案例中运行速度较慢