Это правда, что функция, объявленная в цикле, это не одна функция, это столько же функций, сколько итераций цикла. Это не правда, что это лучше или хуже, чем иметь одну функцию вне цикла.
Иногда это именно то, что вы хотите, например, если вы хотите замыкание для переменных внутри вашего цикла:
// 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
). Если вы можете совместно использовать один на всех итерациях, вам не нужно делать копию для каждой итерации, но для небольших объектов и примитивов вам определенно следует сделать копию в любом случае, если это сделает ваш код чище.
Для очень больших объектов и функций, которые могут совместно использоваться на всех итерациях, обычно лучше создавать их вне цикла, но я подчеркиваю, что это должно быть очень большой объект или цикл с несколькими тысячами итераций, чтобы действительно иметь значение.