Замыкания Javascript

Всем доброго времени суток. На связи Алексей Гулынин. Данная статья является продолжением темы про область видимости переменных. В данной статье я бы хотел поговорить про замыкания в Javascript. Мы уже знаем, что внутри функции имеем доступ к тем же глобальным переменным и переменным, объявленным во внешней функции. Почему такое происходит? Каждая функция в момент создания образует некий "лексический контекст" – специальный объект "scope", в котором хранятся все локальные переменные этой функции.
В этот контекст попадают все переменные ближайшего внешнего контекста (те функции, которые являются внешними по отношению к нашей) и так далее по цепочке, вплоть до глобального контекста. В результате получается так называемая "scope chains" – цепочка объектов "scope". Приведу простой для понимания пример:
function vnesh() { var a = 10; return function() // возвращаем аннонимную функцию { alert(a); //в возвращаемую функцию попадает значение a, которое объявлено во внешней функции vnesh() } } var result = vnesh(); result(); //выйдет 10
В момент создания анонимной возвращаемой функции в ее контекст попало значение внешней переменной "a". Теперь мы можем вызывать эту функцию в любой момент времени – значение переменной "a" будет доступно при каждом вызове.
Этот процесс, при котором переменные внешнего контекста попадают в контекст создаваемой функции, и называется замыканием ("closure"). По определению замыкание – это функция, находящаяся внутри создаваемой функции, которая и передает значения внешних переменных в ее лексический контекст. Мы замыкаем значения переменных из внешних контекстов на саму функцию. Эти значения определяются на момент завершения работы ближайшего внешнего контекста.
Следующий пример обычно вызывает сложности с пониманием:
for (var i = 0, func = []; i < 4; i++) { func[i] = function() { alert(i); } } //Проверяем, что выведут наши функции for (var i = 0; i < func.length; i++) { func[i](); }
Во всех случаях будет значение, равное "4". Почему же так произошло?
Для функций, записываемых в массив, внешним контекстом является тот, в котором выполняется цикл "for". После завершения работы цикла переменная "i" этого контекста равна "4". Именно это значение и попадет в контекст создаваемых функций.
В данной статье вы узнали про замыкания в Javascript и о том, как этот механизм работает.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.