Область видимости и поднятие в javascript
Блоки кода, например те, которые мы определяем за if
, не создают новую область видимости. Только функции создают новые области видимости.
javascript
var war = 1;
function showWar() {
if (!war) {
var war = 10;
}
console.log(war);
}
showWar(); // 10
Что десь происходит: переменная war
поднялась, но значение переменной не поднялось. Поэтому выполнится условие
и в консоли будет выведено 10
.
Интерпретатор JavaScript всегда «поднимает» объявления функций и переменных в начало области видимости. Параметры функций и встроенные переменные языка, очевидно, изначально уже находятся в начале.
Обратите внимание, что присваивание значений переменным не поднимается вместе с их объявлением. Поднимаются только объявления переменных. В случае с функциями, поднимается вся функция целиком, если речь идет о функциях-объявлениях (declaration); функция-выражение (expression) не поднимается.
Например, следующий код:
javascript
function foo() {
bar();
var x = 1;
}
интерпретируется так:
javascript
function foo() {
var x;
bar();
x = 1;
}
Хорошая статья про поднятие в javascript: javascript область видимости и подъем
Русский перевод: на habrahabr.ru
Комментарии к статье