Еще раз напишу другими словами то, что написал Меч.
Ключевая штука которую Вы тут не понимаете называется hoisting.
Это то, что когда вы пишете var a; это объявление распространяется на всю текущую область видимости. То есть в данном случае где бы Вы его не написали это эквивалентно написанию в начале функции. Именно поэтому значение a не вытягивается из замыкания: переменная a уже есть в локальном скоупе, поэтому берется оттуда. Присваивание не всплывает, только объявление. Поэтому a на момент обращения равно undefined.
|