Я думаю, вы запутались, потому что Javascript использует статическую область видимости, но на уровне функций, а не на уровне блоков, как обычные структурированные языки.
var foo = "old";
if (true) {var foo = "new";}
alert (foo == "new")
Так что будьте осторожны, блоки не выходят за рамки!
Вот почему вы иногда видите циклы с функциями внутри просто для включения переменных, область действия которых находится внутри итерации:
functions = [];
for(var i=0; i<10; i++) {
(function(){
var local_i = i;
functions[local_i] = function() {return local_i;}
})();
}
functions[2]() // returns 2 and not 10