JavaScript декларирует функцию внутри или вне цикла «каждый» - PullRequest
0 голосов
/ 03 ноября 2018

У меня нет проблем, просто вопрос к кому-то, кто очень хорошо знает JS. Что лучше объявить и запустить функцию в «каждом цикле» или лучше объявить ее снаружи, а затем запустить в цикле? Где-то я читал, что если функция объявляется в каждом цикле, JS-компилятор обрабатывает это объявление столько же раз, сколько будет выполняться цикл, но когда вы объявляете функцию вне цикла, JS обрабатывает ее только один раз, а затем может легко запустить ее каждый раз в петля. Это правда, и лучше объявить функцию вне цикла, или это не имеет значения для языка JS, и выполнение кода займет в обоих случаях одинаковое количество времени?

Ответы [ 3 ]

0 голосов
/ 03 ноября 2018

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

0 голосов
/ 03 ноября 2018

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

0 голосов
/ 03 ноября 2018

Это правда, что функция, объявленная в цикле, это не одна функция, это столько же функций, сколько итераций цикла. Это не правда, что это лучше или хуже, чем иметь одну функцию вне цикла.

Иногда это именно то, что вы хотите, например, если вы хотите замыкание для переменных внутри вашего цикла:

// Creates 5 functions and calls them 500 ms apart
for ( let i = 1; i <= 5; i ++ ) {
    setTimeout( log_i, i*500 );
    function log_i ( ) {
        console.log( i );
    }
}

или

// Creates 5 functions and calls them 500 ms apart
[1,2,3,'foo','bar'].forEach( function ( x, i ) {
    setTimeout( log_x, (i+1)*500 );
    function log_x ( ) {
        console.log( x );
    }
} );

То же самое с обычными объектами и даже переменными, которые просто содержат примитив. Если вам нужен другой для каждой итерации, вы должны объявить его в цикле (с let или const). Если вы можете совместно использовать один на всех итерациях, вам не нужно делать копию для каждой итерации, но для небольших объектов и примитивов вам определенно следует сделать копию в любом случае, если это сделает ваш код чище.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...