Вам нужно, чтобы i
и item
из разных функций были отдельными переменными в разных областях (чтобы они могли иметь разные значения вместо того, чтобы делиться ими). Поскольку Javascript имеет только область действия функции, вам нужно создать функцию-оболочку, которая будет содержать эти переменные
function buildList(list) {
var result = [];
function make_f(item, i){
//item and i are now private variables of make_f
//and wont be shared by the returned closure
// the other variable in scope (list) is not shadowed so
// it is still shared but that is not a problem since we
// never change its value.
return function() { alert(item + ' ' + list[i]) };
}
for (var i = 0; i < list.length; i++) {
var item = 'item' + list[i];
result.push( make_f(item, i) );
}
return result;
}
Вы также можете сделать то же самое с анонимной функцией, которая вызывается немедленно (шаблон (function(){}())
).
function buildList(list) {
var result = [];
for (var i = 0; i < list.length; i++) {
var item = 'item' + list[i];
result.push( (function (item, i){
return function(){function() {alert(item + ' ' + list[i])};
})(item, i) );
}
return result;
}