Ваш код выводит undefined, потому что эквивалентен следующему
(function() {
var a=1;
(function(){
var a; // оно undefined,
alert(a); // Ожидал получить 1, выводит "undefined"
a=2;
// alert(a); // тут уже 2
(function(){
alert(a); // Выведет 2.
})();
})();
alert(a); // Выведет 1.
}) ();
Это логично, если прочитать о том, как ищутся в js переменные в вложенных областях видимости и про объект вызова заодно