Задать вопрос
@6ondawave9

Почему переменная теряет видимость?

Если через консоль 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;
то тоже все окей
Вопрос знатокам почему так? Чувствую, что замешаны замыкания и переопределение контекста, но поведение похоже больше на какой-то баг
  • Вопрос задан
  • 100 просмотров
Подписаться 2 Простой 3 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы