В показанном коде вывода нет, потому что console.log закомментирован. Если его раскомментировать, каждый из трёх таймеров покажет массив [1, 1, 1].
Таймеры с общим массивом: вывод после раскомментирования
В показанном коде вывода нет, потому что console.log закомментирован. Если его раскомментировать, каждый из трёх таймеров покажет массив [1, 1, 1].
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какой результат будет напечатан в консоли.
for (var arr = []; arr.length < 3; arr.push(1)) {
setTimeout(function () {
// console.log(arr);
}, 1000);
}
Ответ
В показанном коде вывода нет, потому что console.log закомментирован. Если его раскомментировать, каждый из трёх таймеров покажет массив [1, 1, 1].
Цикл выполняется синхронно и три раза регистрирует callback. После каждой итерации arr.push(1) увеличивает длину, пока она не станет равной 3.
Все callbacks обращаются к одной переменной arr и одному массиву, а не к снимку его содержимого при регистрации. К моменту таймеров массив уже заполнен. Для сохранения промежуточного состояния пришлось бы создать отдельную копию внутри каждой итерации.