そこには2つの問題があります。1つはJSHintが警告している問題で、もう1つはより基本的な問題です。
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]
そのキーの配列を取得します。