Использовать самовыполняющуюся функцию :
for (var i = 0; i < codes.length; ++i) (function(bound_i) {
setTimeout(function(){alert(codes[bound_i]);},100);
})(i);
При желании можно использовать оператор var
для более подробного кода:
for (var i = 0; i < codes.length; ++i) (function() {
var bound_i = i;
setTimeout(function(){alert(codes[bound_i]);},100);
})();
Или используйте взамен именованную функцию, если хотите:
function foo(i) {
setTimeout(function(){alert(codes[i]);},100);
}
for (var i = 0; i < codes.length; ++i) {
foo(i);
}
Любой пример формирует замыкание, которое вводит новую переменную scope. В качестве альтернативы, ES5 имеет Function.bind , который можно использовать в анонимной функции, но пока он поддерживается не во всех браузерах. (Я думаю о IE.)