JSHint不会让我在使用“的forEach“for”循环(JSHint won't let

2019-07-29 06:28发布

我有数组作为值的对象。

people = {
    'steve':['foo','bar'],
    'joe':['baz','boo']
}

对于每一个键,我想遍历所有的值相应的数组英寸 很简单:

for ( var person in people ) {
    person.forEach( function(item) {
      console.log(item)
    })
}

但JSHint抱怨:

Don't make functions within a loop.

这是真正的我的代码的问题吗? 我挺喜欢的for循环语法短期ES5。 我是否需要使用ES3风格或改变一些其他的方式我的代码?

Answer 1:

有两个问题在那里,一个JSHint是警告你,和一个更根本的一个。

该JSHint是警告你的事情是,从理论上讲, 一个循环运行时间 ,创建一个新的功能。 这将是更好的:

for ( var person in people ) {
    person.forEach(handlePerson);
}
function handlePerson(item) {
  console.log(item)
}

我说“理论上”,因为虽然该规范要求,一个新的函数对象每次,这并不意味着引擎不能重用功能的底层实现创建的,它并不意味着引擎不能重用相同功能的对象,如果你没有指定任何其他属性,或保持一个参考吧。 我问了一下它的V8家伙 (V8是Chrome的JavaScript引擎),他们说,Chrome将“......在大多数情况下......”重用在同一地点创造不同的函数对象的基本功能的实现源代码,他们会“期待”,大多数其他引擎也这样做。

所以JSHint可能是有点过度的顶部在这种特殊情况下。 但它是经常有用的警告,尤其是如果你在循环中创建函数引用变量,其内容的循环,这是经典的闭合差的人做过程中改变。

但更重要的是, person是一个String (这是在属性名people ),和String没有forEach 。 你自找的:

for ( var person in people ) {
    people[person].forEach(handlePerson);
}
function handlePerson(item) {
  console.log(item)
}

...例如, people[person]来获得该密钥的阵列。



Answer 2:

除了其他的评论者,如果你知道自己在做什么,你可以禁用与JSHint选项此警告loopfunc

/*jshint loopfunc:true */

for ( var person in people ) {
  person.forEach( function(item) {
    console.log(item)
  })
}

您可以设置JSHint全局选项(如果你使用NPM模块),每个文件或每个功能。



Answer 3:

你允许使用forEach循环里面,但你不能宣布一个循环内的功能。

function looper (item) {
  console.log(item)
}

for ( var person in people ) {
    person.forEach(looper)
}

......否则你要重新每次迭代相同的功能。



Answer 4:

这不是在foreach,那就是它的抱怨匿名函数。



Answer 5:

究其原因,这是一个问题是,它创建一个新的对象引用内部的匿名函数foreach在Heap每次你这样做的时候调用。 它会更好,如果您分配的功能的for循环的变量外,这样,你是不是吃了不必要的内存



文章来源: JSHint won't let me use 'forEach' in a 'for' loop