2015-08-18 4 views
0

При запуске следующего кода я ожидал, что предупреждение в конце функции будет использовать глобально определенное значение переменной для «a» (1), но вместо этого оно не будет определено. Если код в блоке if никогда не запускается, почему переменная «a» возвращается как неопределенная?Глобальная переменная undefined - проблема с областью

var a = 1; 
four(); 

function four() { 
    if (false) { 
    var a = 4; 
    } 

    alert(a); //alerts undefined 
} 

ли Javascript анализатор «видеть» объявление переменной в пределах сферы действия условного выражения таким же образом, что это будет «видеть» его за пределами этого?

+0

Я думаю, что здесь происходит, что а в определении функции в настоящее время поднимается к верхней части функции, так что вы сообщаете является неопределенным «а» в пределах определение функции, так как это не присваивается, если выполняется оператор if. – Brodie

+0

@Brodie: Это не имеет ничего общего с функцией подъема. – SLaks

+0

@SLaks, что пыталось сказать, заключалось в том, что поскольку a назначается как переменная функции 'four', перед тем, как ее запускают, она не определена внутри области действия функции. - Извините, если моя терминология отключена. – Brodie

ответ

2

Поскольку объявления переменных «подняты» в верхней части их области, второй var a устанавливается внутри области действия. поэтому в основном это превращается в нечто вроде:

function four() { 
    var a; 

    if (false) { 
    a = 4; 
    } 

    alert(a); //alerts undefined 
} 

если вы были для удаления второго задания в функции four вы предупредите переменную window.a, а не four.a один.

т.е.

var a = 1; 

function four() { 
    if (false) { 
    a = 4; 
    } 

    alert(a); //alerts 1 
} 
0

Да.

Все объявления переменной (и функции) Javascript «поднимаются» на их содержащую функцию.

Локальная переменная существует по всей вашей функции (даже до if), но будет иметь значение после ее назначения.

+1

Это не совсем ответит на вопрос, я думаю. Остается вопрос: «Почему он не печатает« 1 »или« 4 »? Почему« undefined »? – Jashaszun

+0

@Jashaszun: поскольку локальная переменная не имеет значения. – SLaks