Колпачки имеют важное значение в JavaScript, но важно понять, что именно вы closing
над. Чтобы переработать ваш текущий код (вид).
function(){
var i;
for(i=0;i<10;i++){
setTimeout(function(){
console.log(i);
}, 1000);
}
}
В этом примере, код в основном закрытие над var i;
, что означает, что, когда работает таймер, он будет считывать значение var i;
и печать это. В этом случае, как вы видели, когда таймер запускается, цикл завершается, и значение равно 10
.
Что вы хотите сделать, это создать новую область функций, которая фиксирует значение i
в определенное время.
function(){
var i;
for(i=0;i<10;i++){
(function(iInner){
setTimeout(function(){
console.log(iInner);
}, 1000);
})(i);
}
}
Этот пример создаст новую анонимную функцию, а затем вызвать его сразу в петлю, и передать текущее значение i
в него, так что, когда таймер читает iInner
, он будет считывать значение, которое было передается в функцию, а не значение от var i;
. Вы также можете просто позвонить iInner
i
, если хотите, но я использовал два разных имени для ясности.
Есть также помощники, которые вы можете использовать, например .bind
, которые по существу автоматически создадут для вас новую анонимную функцию и передадут аргументы, подобные этому.
function(){
var i;
for(i=0;i<10;i++){
setTimeout(function(iInner){
console.log(iInner);
}.bind(null, i), 1000);
}
}
<func>.bind
примет значение i
и возвращает новую функцию, которая проходит эту арг через к <func>
при вызове, и избежать того, чтобы создать еще один слой вложенности.
Нет! Это просто печатает '10' десять раз. Вот почему нам нужны замыкания. –