2016-10-27 8 views
1

Глядя на грузоподъемных пример из этой site, я не понимаю, почему ниже изменяет 1 даже после подъема:Как работает декларация пустой функции с подъемом в javascript?

var a = 1; 
function b() { 
    a = 10; 
    return; 
    function a() {} 
} 
b(); 
alert(a); // alerts 1 

фактически

var a = 1; 
function b() { 
    function a() {} 
    a = 10; 
    return; 
} 
b(); 
alert(a); 

Не должна ли она изменить 10, потому что a все еще назначено на 10 до b функция возвращает? Зачем это вызвано вызовом пустой функции? Что касается связанного примечания, почему нижеследующая функция не оповещает, но все еще меняет 1? Не a переназначить функцию с объявлением?

var a = 1; 
function a() {} 
alert(a); 
+1

'функция а() {}' просто как ' var a; '. 'A' в' b' не является 'a' наружу. Также 'a' никогда не вызывается. – Xufox

+0

'function a() {}' создаст указатель для функции, а 'a = 10' присваивает/заменяет значение этому указателю, а не' a' определяется за пределами – Rajesh

+0

. Ваш первый фрагмент кода * не * фактически анализируется как второй один. Переменная 'a' всегда остается за пределами функции' a() '. – haim770

ответ

4

Давайте построчно,

Здесь b(); вы вызываете функцию b. Что имеет функция b в своем теле? Объявление новой функции, имя которой a. Когда вы получаете доступ к a внутри b, вы фактически не получаете доступ к глобальной переменной a, а только о той функции, которую вы только что объявили. Таким образом, 10 будет установлен на указатель, который указывает на функцию, называемую a, а не глобальную переменную, называемую

Но почему первый блок кодовых предупреждений 1? Я смущен

Потому что, когда двигатель JavaScript идет выполнить задание:

a = 10; 

проверяет, где a было определено. Поскольку в текущей области, где вы пытаетесь установить 10 на a, есть объявление функции, имя которой равно a. Тогда произойдет то, что я описал выше. Но вы бы сказали, почему? Объявление функции ниже назначения. Причина, по которой это происходит, - это то, что движок JavaScript сначала обрабатывает объявления в вашем скрипте, а затем переходит к выполнению вашего скрипта. Поэтому, когда двигатель будет задан вопрос о a, где определяется a, как всегда он будет выглядеть сначала в текущей области. Если его там нет, он будет выглядеть в области, где заключена текущая область. В вашем случае это глобальный масштаб, поскольку я могу сделать вывод из вашего кода. Поэтому, если вы определяете эту функцию, второй шаг, который я упомянул ранее, был бы выполнен, и поскольку существует переменная с именем a, она изменила бы ее значение. Если не существует какой-либо переменной, то a была бы определена на глобальном масштабе, и это значение было бы 10.

var a = 1; 
 
function b() { 
 
    a = 10; 
 
    return; 
 
    // I renamed the function from a to c to notice the hoisting 
 
    function c() {} 
 
} 
 
b(); 
 
console.log(a);

+0

Но почему первый блок кода предупреждает 1? Я запутался –

+0

@Reddy _ "[Y] ou фактически не имеет доступа к глобальной переменной' a' "_. – Xufox

+0

@Xufox, но 'a = 10;' будет иметь доступ к глобальному определению 'a' справа? –

 Смежные вопросы

  • Нет связанных вопросов^_^