когда я вызываю функцию с помощью setTimout следующим образом:
function f2() { console.info("hey"); }
setTimeout("f2()", 3000);Работает отлично.
Но когда я оборачиваю все внутри функции f1 вот так:
function f1() {
function f2() { console.info("hey"); }
setTimeout("f2()", 3000);
}
f1();Я получаю сообщение об ошибке: f2 не определено. Почему это происходит и как это обойти?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


setTimeout - это асинхронный вызов. Это позволит продолжить выполнение остальной части кода, пока не будет достигнута задержка. Когда это происходит, если переданное значение является строкой, эта строка должна быть оценена, например eval("f2()"). Но поскольку код уже прошел, функция f2 больше не находится в видимой области видимости и, следовательно, не может быть найдена.
Вместо использования строки просто передайте ссылку на функцию напрямую
setTimeout(f2,3000)
демонстрация
function f1(){
function f2(){ console.info("f2 logging"); }
setTimeout(f2,3000);
}
f1();
Не уверен, почему за это отказывают. Мне кажется, это законная проблема.