Из того, что я помню, подъемный вызывает то, что inner
функция может рассматриваться как таковые:
function inner(){
var a;
console.log(a);
a = 10;
}
Так что, когда вы назначаете a
10, он смотрит на область действия, пока он не находит определение для a
, который находится в операторе var
внутри функции inner
. Он не видит необходимости выходить за пределы этого, поэтому он действует как a
в функции outer
не существует. Кроме того, когда выполняется var a;
, по умолчанию a
установлен на undefined
. Вот почему вы видите undefined
для вывода.
Я объясню это немного шире интерпретатора Javascript выполняет следующие действия, когда он сталкивается функции (Это известно как Контекст выполнения) А- Этап создания 1- первого шага он делает недоступное объект, называемое изменяемым объектом, его похоже, что для внешней функции
a: undefined
inner : pointer to function
2- Она определяет цепочку области функции и значение «этого»
B- выполнение кода Stage Он выполняет код построчно
и если он встречается вызов функции, которая еще не объявлена, она будет исполнять это помнить
inner : pointer to function
Если вы назвали внутренний() перед объявлением, это хорошо, но это не работает анонимные функции
Как это лечить, как любой переменной
fn();
var fn = function() {..}
это не будет работать, потому что его объект переменной будет как то
fn: undefined
vars go to the top, поэтому ваш код действительно является функцией inner() {var a; console.log (а); а = 10; } – dandavis
Поскольку это именно то, что означает подъем: он не будет проходить дальше по цепочке видимости, потому что идентификатор ** уже найден в области 'inner' ** и разрешает внутреннюю переменную' a', даже если она не имеет но были инициализированы. – Bergi