Переменная a
уже видна, но ее значение {a:1}
не присваивается, пока выполнение не достигнет var
. Ситуация несколько отличается для локальных функций, объявленных с function foo(){...}
, потому что имена связаны с соответствующими функциями / замыканиями до начала выполнения.
Если вы вызываете замыкание i
до присвоения a
значения, которое вы получить проблему, однако с
(function(){
function i(){
console.log(foo());
}
i();
function foo() { return 42; }
})();
выходное значение равно 42, и ошибки нет.
Обратите внимание, что это действительно так, поскольку используется оператор function
... изменяя код на
(function(){
function i(){
console.log(foo());
}
i();
var foo = function(){ return 42; }
})();
выдает ошибку, потому что в этом случае при выполнении i()
foo
еще не привязан к функции (как в вашем случае).