Если это один обычный браузерный script, сначала выводятся 3 и 10, затем возникает ReferenceError на k; позже три таймера выводят по 3.
// 1
Если это один обычный браузерный script, сначала выводятся 3 и 10, затем возникает ReferenceError на k; позже три таймера выводят по 3.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
// 1 for (var i = 0; i < 3; i++) { setTimeout(() => console.log(i)) }
// 2 console.log(i) var j = 10 console.log(j)
// 3 console.log(k) const k = 10 console.log(k)
// 4 var a = 2 var b = a b++ console.log(a) console.log(b)
// 5 var c = [1, 2, 3] var d = c d.push(4) console.log(c)
Ответ
Если это один обычный браузерный script, сначала выводятся 3 и 10, затем возникает ReferenceError на k; позже три таймера выводят по 3.
var i общий для всех callback и после цикла равен 3. Доступ к const k до инициализации попадает в temporal dead zone, поэтому оставшаяся синхронная часть этого script не выполняется; ошибка не отменяет уже поставленные браузерные таймеры. Если блоки запускать отдельно, блок 2 без внешнего i сам упадёт на первом чтении. Отдельный блок 4 выводит 2 и 3, блок 5 — массив [1, 2, 3, 4], поскольку c и d ссылаются на один объект. В среде, завершающей процесс при необработанной ошибке, таймеры могут не выполниться.