Всплытие Function Expression
Недавно изучаю JS, подскажите пожалуйста следующее поведение функционального выражения
const foo = function() {
someFoo(); // тут работает
};
someFoo(); // ReferenceError - тут ошибка, что логично
const someFoo = function() {
};
Заранее прошу не кидать камнями =)
Ответы (1 шт):
Когда функция foo определяется имя someFoo не определено. Неопределённые символы попадают в замыкание. Пока всё.
Когда foo будет вызвана, она обратится к символу someFoo (а он ещё не определён) и выбросит ReferenceError.
Если код между определением foo и её вызовом успеет определить имя someFoo ошибки не будет.
Вот ещё один пример на ту же тему. Первый вызов f ошибается, второй работает:
const f = () => v;
try {
f();
} catch (e) {
console.log(e);
}
const v = 42;
console.log(f());
$ node f.js ReferenceError: Cannot access 'v' before initialization at f (/home/sv/desk/stackoverflow/temp.js:1:17) at Object.<anonymous> (/home/sv/desk/stackoverflow/temp.js:4:5) at Module._compile (internal/modules/cjs/loader.js:999:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10) at Module.load (internal/modules/cjs/loader.js:863:32) at Function.Module._load (internal/modules/cjs/loader.js:708:14) at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12) at internal/main/run_main_module.js:17:47 42
P.S. И к function declaration hoisting вся эта история отношения не имеет. "Всплытие" функции позволяет вызывать её до определения. Функции "всплывают" только если они определены через function declaration. Не пользуйтесь этим механизмом. Он странный, устаревший и не нужный.