2013-07-08 6 views
0

Я отчасти смущен, как лексическая обзорное делается в JavaScript, напримерJavascript Сфера цепи грузоподъемных

function outer(){ 
    a = 5; 
    function inner(){ 
     console.log(a); 
     var a = 10; //hoisting 
    } 
    inner(); 
} 
outer(); 

Если переопределить a в строке 5, то он будет печатать undefined. Почему это? Почему переводчик не проходит и не проверяет outer.VO, хотя a можно найти в inner.VO, но он используется до его определения?

+4

vars go to the top, поэтому ваш код действительно является функцией inner() {var a; console.log (а); а = 10; } – dandavis

+0

Поскольку это именно то, что означает подъем: он не будет проходить дальше по цепочке видимости, потому что идентификатор ** уже найден в области 'inner' ** и разрешает внутреннюю переменную' a', даже если она не имеет но были инициализированы. – Bergi

ответ

3

Из того, что я помню, подъемный вызывает то, что 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