JavaScript и области видимости

29 Apr 2015

Об этой особенности полезно иногда вспоминать.

// глобальная переменная, которую мы попытаемся дальше получить  
var bar = 42;

// Мозг предполагает, что до объявления bar в теле функциии глобальный bar будет доступен  
function simple\_define() {  
 alert(bar);  
 var bar = 10;  
 alert(bar);  
}

// Но это не так. Функция выше на самом деле выглядит вот так  
function real\_define() {  
 var bar;  
 alert(bar);  
 bar = 10;  
 alert(bar);  
}

// А что же с условиями? Разве они не создают локальные области видимости?  
function define\_inside\_if() {  
 if (true) {  
 var bar = -10;  
 }

alert(bar);  
}

// Ну а циклы?  
function define\_inside\_while() {  
 do {  
 var bar = 10;  
 } while (false);  
 alert(bar);  
}

// И переменные из for?  
function define\_inside\_for() {  
 for (var bar = 0; bar \< 10; bar++);  
 alert(bar);  
}

/\*  
 \* Да. Это особенность js - компилятор собирает все объявления переменных текущей области видимости  
 \* и выделяет под них все требуемые ресурсы сразу при входе в функцию.  
 \*/