Закрытие Javascript «сохраняет» значение в неподходящее время

Я пытаюсь увеличить счетчик постепенно. Следующие действия работают:

function _award(points){    
  var step = 1;
  while(points){
    var diff = Math.ceil(points / 10);
    setTimeout( "_change_score_by("+diff+");" /* sigh */,
                step * 25);
    points -= diff;
    step++;
  }
}

Однако он использует неявный eval. Зло! Давайте вместо этого воспользуемся закрытием, не так ли?

function _award(points){    
  var step = 1;
  while(points){
    var diff = Math.ceil(points / 10);
    setTimeout( function(){ _change_score_by(diff); },
                step * 25);
    points -= diff;
    step++;
  }
}

Очевидно, это не работает.Все созданные замыкания захватывают последнее значение diff в функции - 1. Следовательно, все анонимные функции увеличивают счетчик на 1 и, например, _award ( 100) вместо этого увеличит счет на 28.

Как я могу сделать это правильно?

6
задан badp 17 October 2010 в 15:11
поделиться