devote Может показаться что функции работают следующим образом, когда функции нужно сделать
чтото с переменной то она попробует найти эту переменную внутри себя, внутри своей области видимости
и если она не находит нужную переменную то она обращается к глобальной области видимости. Но это не так.
На самом деле функции при поиске нужных переменных просто поднимаются вверх по областям видимости 
родительских функций (ох загнул 

)
К примеру код:
var a = 'Я глобальная переменная A';
var b = 'Я глобальная переменная B';
function first () {
  var a = 'Я переменная A обьявленная в функции first';
  
  function second () {
	alert(a);
	alert(b);
  }
  second();
}
first();
При запуске функции 
second первому алерту нужна переменная 
А но ее нету внутри функции, поэтому функция
попробует найти эту переменную в родительской функции, тоесть в функции 
first. Здесь эта переменная есть.
А при запуске второго алерта функция попробует найти переменную 
B в родительской функции(
first) но там ее нету,
поэтому нужно подниматься еще выше, а выше глобальная область видимости.
Поэтому сколько у функции есть родительских функций, столько она и будет подниматься в поисках нужно переменной.
Это очень похоже на всплытие событий.