Ответ 1
Есть две проблемы: одна, о чем предупреждает JSHint, и более фундаментальный.
О том, что JSHint предупреждает вас о том, что теоретически каждый раз работает цикл, создается новая функция. Это было бы лучше:
for ( var person in people ) {
person.forEach(handlePerson);
}
function handlePerson(item) {
console.log(item)
}
Я говорю "теоретически", потому что, хотя спецификация требует, чтобы каждый новый объект функции создавался каждый раз, это не означает, что двигатели не могут повторно использовать базовую реализацию функции, и это не означает, что двигатели могут Повторное использование одного и того же объекта функции, если вы не присвоили ему никаких других свойств или не сохранили ссылку на него. Я спросил об этом ребята V8 (V8 был движком JavaScript в Chrome), и они сказали, что Chrome будет "... в большинстве случаев..." повторно использовать реализация базовых функций для разных объектов функций, созданных в одной и той же точке исходного кода, и что они "ожидают", что большинство других движков будут делать то же самое.
Таким образом, JSHint может быть немного выше, чем в этом конкретном случае. Но часто это полезное предупреждение, особенно если функции, которые вы создаете в цикле, относятся к переменным, содержимое которых изменяется во время цикла, что является классической ошибкой закрытия, которую делают люди.
Но более принципиально person
является String
(это имя свойства в people
), а String
не имеет forEach
. Вы хотели:
for ( var person in people ) {
people[person].forEach(handlePerson);
}
function handlePerson(item) {
console.log(item)
}
... например, people[person]
, чтобы получить массив для этого ключа.