ozknemoy
@ozknemoy
яваскриптист

Почему тут ошибка?

почему во второй строчке кода TypeError: f is not a function ?

(function() {
    f();
    var f = function() { console.log(1) }
})();
function f() { console.log(2) }
f();

а тут все нормально
(function() {
    f();
    f = function() { console.log(1) }
})();
function f() { console.log(2) }
f();
  • Вопрос задан
  • 149 просмотров
Решения вопроса 1
delphinpro
@delphinpro Куратор тега JavaScript
frontend developer
function declaration поднимается наверх скоупа, объявления тоже, а var объявляет локальную переменную

Ваш код в представлении интерпретатора javascript:
function f() { console.log(2) }
(function() {
    var f;
    f(); // f локальная и  сейчас undefined
    f = function() { console.log(1) } // и только тут в нее пишется ссылка на функцию
})();
f();


Второй вариант:
function f() { console.log(2) }
(function() {
    f(); // f функция из родительского скоупа
    f = function() { console.log(1) } // а тут она просто перезаписывается
})();
f();
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Объявив переменную через var вы говорите интерпретатору, что внутри данного блока используется своя переменная, перекрывающая внешнюю одноимённую переменную.
В первом случае переменная f локальная и на момент вызова f() она только объявлена, но ещё не определена.
Во втором - переменная глобальная и явно определена как function f().
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы