JS Hint - не выполнять функции внутри цикла
Я не могу обойти сообщение об ошибке JSHint. Вот цикл, который я использую:
for (i = 0; i < Collection.length; i += 4) {
data.push({
items : Collection.slice(i, i + 4).map(function(item) {
return {
id: item[0],
title: item[1],
};
})
});
}
Ответы
Ответ 1
Вы можете просто переместить функцию за пределы цикла и передать ссылку на нее map
:
function mapCallback(item) {
return {
id : item[0],
title : item[1],
};
}
for (i = 0; i < Collection.length; i += 4) {
data.push({
items: Collection.slice(i, i + 4).map(mapCallback)
});
}
В качестве альтернативы вы можете использовать директиву JSHint для игнорирования выражений функций внутри циклов. Просто поставьте это в верхней части файла, о котором идет речь:
/*jshint loopfunc: true */
Ответ 2
Объявление функции в цикле является беспорядочным и потенциально подверженным ошибкам. Вместо этого определите функцию один раз, а затем введите цикл.
var objMaker = function(item) {
return {
id : item[0],
title : item[1],
};
};
for (i = 0; i < Collection.length; i += 4) {
data.push({
items : Collection.slice(i, i + 4).map(objMaker)
});
}
Ответ 3
Люди говорят: "Объявление функции в цикле грязно и потенциально подвержено ошибкам", но функции внутри циклов - это то, что прямо указывается, например, в методе Array.prototype.forEach. То, что слово "функция" теоретически должно означать его новое определение в каждом вызове forEach , не означает, что оно фактически определяется каждый раз движком Javascript.
То же самое относится и к внешним циклам, поскольку в двигателях "ленивая" обработка инструкций. Они не собираются переопределять всю конструкционную инструкцию forEach/Map/etc заново, если на самом деле ничего не изменилось, они просто передадут ей новые аргументы.
Времена древних движков JS, которые ничего не знали о таких простых вещах, а также о контексте кода, давно прошли. И все же мы получаем это древнее предупреждение, которое было задумано, когда функции еще не могли быть переданы в качестве аргументов, как в случаях forEach или Map.