Операторы функций подлежат подъему . Это означает, что независимо от того, где функция объявлена, она перемещается в верхнюю часть области, в которой она определена.
(function () {
foo();
function foo() {
alert('foo is beign called');
}
}());
Во время компиляции структура этого кода изменится на:
(function () {
function foo() {
alert('foo is beign called');
}
foo();
}());
Операторы функций - не единственные, которые являются предметом подъема, оператор var
также, из-за этого (и поскольку JavaScript имеет только область действия) рекомендуется иметь только оператор var в верхней части функции, например:
var bar = "baz"; // on the outer scope
(function () {
alert(bar); // bar is undefined
var bar = "other value";
}());
Предупреждение показывает undefined
, потому что внутренне код изменился на:
var bar = "baz";
(function () {
var bar;
alert(bar); // bar is undefined
bar = "other value";
}());