Если через консоль Chrome запустить код ниже, то все работает корректно
let testValue = 123;
function testFn() {
let condition = 0;
let timer = setTimeout(() => {
console.log(testValue);
});
}
testFn(); //123
Сколько угодно раз можно код запускать заново и все работает корректно.
Но при запуске такого же кода, но с добавлением условия
let testValue = 123;
function testFn() {
let condition = 0;
let timer = setTimeout(() => {
if (condition === 0) {
console.log(testValue);
}
});
}
testFn(); //123
при первом запуске все окей, но при повторных попытках получаю ошибку
Uncaught ReferenceError: Cannot access 'testValue' before initialization
Причем если условие заменить на true
ilet testValue = 123;
function testFn() {
let condition = 1;
let timer = setTimeout(() => {
if (true) {
console.log(testValue);
}
});
}
testFn(); //123
то все снова работает корректно
Также если убрать таймаут и поставить самовызывающуюся функцию
let testValue = 123;
function testFn() {
let condition = 1;
let timer = (() => {
if (condition === 1) {
console.log(testValue);
}
})();
}
testFn(); //123
то тоже все нормально
Если весь код обернуть в самовызывающуюся функцию тоже все нормально
(()=>{
let testValue = 123;
function testFn() {
let condition = 1;
let timer = setTimeout(() => {
if (condition === 1) {
console.log(testValue);
}
});
}
testFn();
})();
Если не декларировать заново переменную testValue
let testValue = 123;
то тоже все окей
Вопрос знатокам почему так? Чувствую, что замешаны замыкания и переопределение контекста, но поведение похоже больше на какой-то баг