JavaScript не имеет «области видимости блока», он имеет только область действия функции - поэтому переменные, объявленные внутри оператора if (или любого условного блока), «поднимаются» во внешнюю область.
if(true) {
var foo = "bar";
}
alert(foo); // "bar"
Это на самом делерисует более четкую картину (и появляется на собеседованиях из опыта :))
var foo = "test";
if(true) {
alert(foo); // Interviewer: "What does this alert?" Answer: "test"
var foo = "bar";
}
alert(foo); // "bar" Interviewer: Why is that? Answer: Because JavaScript does not have block scope
Область действия функции в JavaScript обычно относится к замыканиям.
var bar = "heheheh";
var blah = (function() {
var foo = "hello";
alert(bar); // "heheheh"
alert(foo); // "hello" (obviously)
});
blah(); // "heheheh", "hello"
alert(foo); // undefined, no alert
Внутренняя область действия функцииимеет доступ к среде, в которой он содержится, но не наоборот.
Чтобы ответить на ваш второй вопрос, можно достичь оптимизации, сначала создав «минимальный» объект, который удовлетворяет всем условиям, а затем увеличивая или увеличиваяизменение его на основе определенных условий, которые были / были выполнены.