Замыкания Javascript

Замыкания 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 и о том, как этот механизм работает.

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.


Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *