我有一个数组作为值的对象.
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.
解决方法
那里有两个问题,即JSHint警告你的问题,还有一个更为根本的问题.
JSHint警告你的是在理论上,每次循环运行时,都会创建一个新的功能.这会更好:
for ( var person in people ) { person.forEach(handlePerson); } function handlePerson(item) { console.log(item) }
我在理论上说“因为虽然规范要求每次都创建一个新的函数对象,但这并不意味着引擎不能重用函数的底层实现,并不意味着引擎不能重用如果您没有为其分配任何其他属性或保留对其的引用,那么该函数对象也是一样的. I asked the V8 guys about it(V8是Chrome中的JavaScript引擎),他们表示Chrome将“…在大多数情况下…”重新使用源代码中同一点创建的不同功能对象的底层函数实现,他们会“期望”大多数其他引擎都会这样做.
所以JSHint可能在这种特殊情况下有点过高.但是,这通常是一个有用的警告,特别是如果您在循环中创建的函数是指在循环中内容变化的变量,这是人们经常关闭的错误.
但更基本的是,人是一个String(它是人的一个属性的名称),而String不具有forEach.你自找的:
for ( var person in people ) { people[person].forEach(handlePerson); } function handlePerson(item) { console.log(item) }
…例如,人[人]获取该键的数组.