Подтвердить что ты не робот

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],
            };
        })
    });
}
4b9b3361

Ответ 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.