Запутался в подъеме - PullRequest
       32

Запутался в подъеме

3 голосов
/ 18 марта 2012

рассмотрим эти несколько разных версий подъема ...

mylocation = "dublin" 
function outputPosition() {
    alert(mylocation);
    mylocation = "fingal" ;
    alert(mylocation);
}
outputPosition();

Это выведет "fingal", а затем "fingal"

mylocation = "dublin" 
function outputPosition() {
    alert(mylocation);
    var mylocation = "fingal" ;
    alert(mylocation);
}
outputPosition();

Это выведет "undefined" и"фингал"

почему?

Ответы [ 5 ]

6 голосов
/ 18 марта 2012

Как только вы объявите переменную с помощью ключевого слова var в функции javascript, и неважно, куда вы поместите это объявление - в верхней части функции или в нижней части, она будет считаться локальной переменной.Вот почему вы получаете undefined, когда пытаетесь получить значение такой переменной до объявления var.

5 голосов
/ 18 марта 2012

Во втором варианте вы скрываете mylocation (который, я надеюсь, был объявлен во внешней области видимости) с новой переменной через объявление var.

"В JavaScript переменная может быть объявлена ​​после использования." означает: JavaScript поднимает var объявлений до верхней части области ( Независимо от того, где она была объявлена! ), поэтому во второй функции var mylocation неявно определено, но не назначено до первого предупреждения, следовательно, в этот момент выдается undefined.

0 голосов
/ 25 февраля 2017

Взять например:

x = 5;
var x;

console.log( x );

Технически, вы можете рассматривать x = 5; как неправильное утверждение в этом контексте, учитывая тот факт, что оно предшествует объявлению, но JS Engine не работает таким образом. Он видит x = 5 и var x как два отдельных оператора: первый - задачу, связанную с компилятором, а второй - задачу, связанную с выполнением.

что это означает в простых терминах, так это то, что все объявления в области видимости, независимо от того, где они появляются, обрабатываются в первую очередь перед выполнением самого кода. то есть вы можете выполнить переменную перед ее объявлением.

0 голосов
/ 20 июня 2015

В JavaScript - объявления переменных hoisted , но инициализация , а не .Это означает, что когда вы пишете var где-нибудь внутри функции, она будет обрабатываться как объявленная сверху.Так что он не будет принимать ту же переменную имени из глобального пространства.

@ Ашиш прав, первый фрагмент должен вывести «dublin» и «fingal».

0 голосов
/ 11 декабря 2012

Вывод первого фрагмента должен быть "dublin" и "fingal" при условии, что mylocation определен, иначе это ошибка ссылки.

Для более подробной информации:

http://bustingseams.blogspot.in/2009/08/another-javascript-pitfall-hoisting.html

...