Вопрос по javascript – В JavaScript, каковы конкретные причины, по которым создание функций внутри цикла может быть неэффективным в вычислительном отношении?

4

В JavaScript, каковы конкретные причины, по которым создание функций внутри цикла может быть неэффективным в вычислительном отношении?

На странице 39 JavaScript «Хорошие детали», утверждает Дуглас Крокфорд, «Избегайте создания функций внутри цикла. Это может быть в вычислительном отношении расточительным. Я не могу понять, почему создание функций внутри цикла было бы более расточительным, чем снаружи.

@amnotiam верно, просто упомянув это для "тщательности" :П Esailija
В javascript функции являются объектами первого класса, поэтому он всегда создает новый объект функции, когда вы используете выражение функции. Если вы используете объявление функции (более сравнимое с другими языками), оно поднимается и даже не запускается в цикле вообще. Esailija
@Esailija: за исключением того, что вы не должны помещать объявление функции внутри блока операторов цикла (даже если некоторые реализации все еще будут его поднимать). Это должно идти до или после цикла. user1106925
возможный дубликатJSlint error 'Don't make functions within a loop.' leads to question about Javascript itself ? (Это обсуждение действительно интересно в любом случае) fcalderan

Ваш Ответ

2   ответа
5

Потому что вы создаете несколькоFunction объекты вместо повторного использования только одного.

Пример создания идентичной функции ...

for (var i = 0; i < 10; i++) {
    // v--creating identical function in each iteration.
    (function(j) {
        var el = document.createElement('a');
        el.onclick = function() { alert(j); };
        document.body.appendChild(el);
    })(i);
}

Пример повторного использования именованной функции ...

for (var i = 0; i < 10; i++) {
    var el = document.createElement('a');
      // ----------v---calling a reusable function
    el.onclick = createHandler(i);
    document.body.appendChild(el);
}

function createHandler(j) {
    return function() { alert(j); };
}

Два примера имеют один и тот же результат, но второй не требует дополнительных затрат на выполнение двух функций во время цикла. Вместо этого он создает только один обработчик.

Error: User Rate Limit Exceeded TheBrent
2

Создание функции может использовать много ресурсов. Поскольку функции фактически являются объектами, код должен фактически каждый раз создавать новый объект функции, он не может просто создать его один раз, а затем просто повторно использовать.

Создание функции внутри цикла обычно означает, что вы будете создавать множество функций вместо того, чтобы просто создавать одну функцию вне цикла.

Так что это просто вопрос не делать что-то ресурсоемкое внутри цикла, если вы можете сделать это один раз вне цикла. Когда дело доходит до функций, их часто можно создавать вне цикла без изменения логики кода.

Похожие вопросы