Javascript: замыкания и анонимные функции

Идея, как просто объяснить анонимные функции и замыкания.

Обычно функцию мы задаем и используем так:

var global_public_var = "handsome";
function mega_func() {
   var secret_var = "vinchi"
   alert('Hey, ' + global_public_var)
}
mega_func();
// Выведет "Hey, handsome"

Так мы делаем, если предполагаем, что функцию будем использовать в дальнейшем в нескольких местах. Интуитивно, думаю, понятно, что извне функции mega_func() доступа к переменной secret_var нет, т.е. в глобальном пространстве её не видно. Однако, в javascript интересно устроены области видимости: хотя извне доступа к содержимому функции нет, но функция имеет доступ к глобальному содержимому. В нашем примере именно этот механизм позволяет алерту внутри mega_func получить содержимое глобальной переменной global_public_var. Именно это имеется в виду под «замыканием«, mega_func замкнула на себе переменную global_public_var.

Теперь про анонимные функции. Часто бывает, что функция нужна единожды, т.е. только в одном месте.) Например, в обработчиках событий, для map/reduce операций и т.д. В таком случае незачем засорять код лишними функциями с именами, достаточно создать анонимную (без имени) функцию там, где необходимо. Переписать пример выше с использованием анонимной функции можно так:

var global_public_var = "handsome";
var anon_func = function() {
   var secret_var = "vinchi"
   alert('Hey, ' + global_public_var)
}
anon_func();
// Выведет "Hey, handsome"

Тут мы функцию записали в переменную anon_func и после её запустили. А вот опять тоже самое, но вообще без лишних переменных и имен:

var global_public_var = "handsome";
(function() {
   var secret_var = "vinchi"
   alert('Hey, ' + global_public_var)
})();
// Выведет "Hey, handsome"

Думаю, если вы не так давно в javascript, то уже встречали что-то подобное. Что здесь творится: в первых скобках содержится наша анонимная функция, а вторые скобки её тут же запускают!) Такой приём часто используют, когда хотят чтобы какой-то кусок кода был изолирован от воздействия извне, но сам при этом имел доступ к глобальным переменным и функциям.