Когда вы назначаете функцию обработчику кликов, создается закрытие.
Обычно замыкание формируется, когда вы вкладываете функции, внутренние функции могут ссылаться на переменные, присутствующие в их внешних включающих функциях, даже после того, как их родительские функции уже выполнены.
Во время выполнения события щелчка обработчик обращается к последнему значению переменной i
, поскольку эта переменная хранится в закрытии.
Как вы заметили, оборачивая функцию обработчика кликов, чтобы принять переменную i
в качестве аргумента, и возвращая другую функцию (в основном создавая другое закрытие), она работает так, как вы ожидаете:
for ( var i = 0; i < 4; i++ ) {
var a = document.createElement( "a" );
a.onclick = (function(j) { // a closure is created
return function () {
alert(j);
}
}(i));
document.getElementById( "foo" ).appendChild( a );
}
Когда вы выполняете итерацию, фактически создаете 4 функции, каждая функция хранит ссылку на i
в момент ее создания (путем передачи i
), это значение сохраняется во внешнем замыкании, а внутренняя функция выполняется при возникновении события щелчка.
Я использую следующий фрагмент, чтобы объяснить замыкания (и очень простую концепцию карри), Я думаю, что простой пример может облегчить понимание концепции:
// a function that generates functions to add two numbers
function addGenerator (x) { // closure that stores the first number
return function (y){ // make the addition
return x + y;
};
}
var plusOne = addGenerator(1), // create two number adding functions
addFive = addGenerator(5);
alert(addFive(10)); // 15
alert(plusOne(10)); // 11
person
Christian C. Salvadó
schedule
12.10.2009