Мне нравится, что я могу получить столько пробега из этого ответа .
Если вам нужна помощь в применении этого ответа, дайте мне знать.
EDIT
Конечно. Давайте посмотрим на ваш оригинальный код.
//timeout to recheck
setTimeout(function(){
alert('test '+no);
}, 500);
Видите эту анонимную функцию? Тот, который вы передаете в setTimeout()
? Он не вызывается до тех пор, пока таймер не сообщит об этом - что при 500 мс равно через много секунд после , когда цикл завершился.
Вы надеетесь, что no
будет оцениваться "на месте", но это не так - он будет оцениваться во время вызова функции. К этому моменту no
равно 2.
Чтобы обойти это, нам нужна функция, которая выполняется во время итерации цикла, которая сама вернет функцию, которую setTimeout()
может использовать так, как мы ожидаем.
setTimeout(function( value )
{
// 'value' is closed by the function below
return function()
{
alert('test ' + value );
}
}( no ) // Here's the magic
, 500 );
Поскольку мы создаем анонимную функцию и немедленно вызываем ее, была создана новая область видимости, в которой мы можем закрывать переменные. И этот объем закрывается около value
, а не no
. Поскольку value
получает новое значение (ahem) для каждого цикла, каждый из этих lambdas имеет свое собственное значение - то, которое мы хотим получить.
Таким образом, когда срабатывает setTimeout (), он выполняет функцию, возвращенную нашей функцией закрытия.
Надеюсь, это объясняет.