我有数组作为值的对象。
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风格或改变一些其他的方式我的代码?
有两个问题在那里,一个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]
来获得该密钥的阵列。
除了其他的评论者,如果你知道自己在做什么,你可以禁用与JSHint选项此警告loopfunc
:
/*jshint loopfunc:true */
for ( var person in people ) {
person.forEach( function(item) {
console.log(item)
})
}
您可以设置JSHint全局选项(如果你使用NPM模块),每个文件或每个功能。
你允许使用forEach
循环里面,但你不能宣布一个循环内的功能。
function looper (item) {
console.log(item)
}
for ( var person in people ) {
person.forEach(looper)
}
......否则你要重新每次迭代相同的功能。
究其原因,这是一个问题是,它创建一个新的对象引用内部的匿名函数foreach
在Heap每次你这样做的时候调用。 它会更好,如果您分配的功能的for循环的变量外,这样,你是不是吃了不必要的内存