История изменений
Исправление static_lab, (текущая версия) :
Допустим, нам необходимо передать какие-либо переменные в цикле в коллбэк:
for (var i = 0; i < 10; i++) {
window.setTimeout(
function() {
console.log(i);
},
1000
);
}
(В реальности это могло быть обращение по сети и т.п.)
Такой код будет работать неправильно, поскольку переменная свяжется по ссылке, то есть в момент вызова коллбэка цикл уже завершится, и i будет равно 10.
Одним из вариантов решения проблемы может быть использование bind (такое форматирование сделано специально для наглядности):
for (var i = 0; i < 10; i++) {
window.setTimeout(
(function(j) {
console.log(j);
}).bind(this, i),
1000
);
}
Это практически аналогично такому коду:
for (var i = 0; i < 10; i++) {
window.setTimeout(
(function(j) {
return function() {
console.log(j);
};
})(i),
1000
);
}
Можно видеть, что вариант с bind короче.
Исходная версия static_lab, :
Допустим, нам необходимо передать какие-либо переменные в цикле в коллбэк:
for (var i = 0; i < 10; i++) {
window.setTimeout(
function() {
console.log(i);
},
1000
);
}
(В реальности это могло быть обращение по сети и т.п.)
Такой код будет работать неправильно, поскольку переменная свяжется по ссылке, то есть в момент вызова коллбэка цикл уже завершится, и i будет равно 10.
Одним из вариантов решения проблемы может быть использование bind (такое форматирование сделано специально для наглядности):
for(var i = 0; i < 10; i++) {
window.setTimeout(
(function(j) {
console.log(j);
}).bind(this, i),
1000
);
}
Это практически аналогично такому коду:
for(var i = 0; i < 10; i++) {
window.setTimeout(
(function(j) {
return function() {
console.log(j);
};
})(i),
1000
);
}
Можно видеть, что вариант с bind короче.