Это сделано потому, что JavaScript имеет только область действия , а не область блока.Следовательно, каждая переменная, которую вы объявляете в цикле, находится в области действия функции, и каждое создаваемое вами закрытие имеет доступ к той же самой переменной.
Таким образом, единственный способ создать новую область - это вызвать функцию, и эточто делает
(function(i){/* Some code using i */}(i))
.
Обратите внимание, что в вашем примере пропущена важная часть: немедленная функция должна вернуть другую функцию, которая будет обработчиком click
:
someArray[i].onclick = (function(i){
return function() {
/* Some code using i */
}
}(i));
Непосредственная функция ничего особенного.Это как-то встроенное определение функции и вызов функции.Вы можете заменить его обычным вызовом функции:
function getClickHandler(i) {
return function() {
/* Some code using i */
}
}
for(var i=0; i < someArray.length; i++){
someArray[i].onclick = getClickHandler(i);
}