Кстати, еще одна интересная особенность функции заключается в том, что она может не только принимать другую функцию в качестве параметра, но и возвращать функцию при помощи все того же оператора return:
function func1( ) {
var a = 10;
return function( ) {
return a + 100;
}
}
var f = func1( );
console.log(f( )) // выведется 110
Здесь объявлена функция func1, внутри которой объявлена переменная a. Соответственно, переменная a является частью области видимости функции func1.
Далее, func1 возвращает другую функцию, задача которой - сложить значение переменной a со значением 100.
За пределами func1 создается переменная f, в которую присваивается результат вызова функции func1.
Напомню, что результатом функции func1 является другая функция, задача которой - сложить значение переменной a со значением 100.
После объявления переменной f и присвоения ей результата вызова func1, происходит вызов функции f и вывод результат на экран.
Посмотрите внимательно на код и на результат.
Исходя из результата вызова функции f можно сделать вывод, что когда функция возвращает другую функцию, то это другая функция возвращается, запомнив ту область видимости, в которой она была объявлена.
В данном случае, внутри func1 была объявлена переменная a. func1 возвращает анонимную функцию, которая в своем коде использует переменную a, доступную ей через механизм замыканий.
Соответственно, когда func1 возвращает анонимную функцию, анонимная функция не забывает о своей области видимости и может продолжать ей пользоваться не смотря на то что, выход из func1 уже произошел.