Вы должны сделать:
var o = {};
for(var i = 0; i < 5; i++) {
(function(i) { // <- self-executing anonymus function with a parameter i
o[i] = function() {
console.log(i); // <- i here will be the argument i,
// not the i from the loop
};
})(i); // <- pass i as an argument
}
o[3]();
Что происходит, что вы создаете нечто, называемое закрытие с тем, чтобы сохранить состояние я.
Закрытие означает, что внутренняя функция сохраняет ссылку на внешней функции и так получает доступ к его переменным и параметрам (даже после того, как внешней функция вернула).
Тривиальный пример для закрытия является:
function outer(arg) {
var variable = 5;
arg = 2;
function inner() {
alert(variable); // <- the inner function has access to the variables
alert(arg); // and parameters of the outer function
}
}
Самостоятельно исполнения (самоосуществляющийся или непосредственное) функция является функцией, которая вызывается сразу после того, как он объявлен.
(function() {
alert("executed immediately");
})();
Сочетание обоих и тот факт, что только функции имеют сферы в Javascript, приводит вас к технике, упомянутой выше, чтобы создать сферу с новой функцией, которая сохраняет состояние я, который в противном случае был бы изменен внутренней функцией из-за закрытия.
Спасибо, что сработали. – fent