Передача аргумента в setTimeout в цикле for - PullRequest
2 голосов
/ 03 июля 2011

Я пытаюсь узнать, как передать аргумент setTimeout в цикле javacript for. Вот пример кода. Как написано в настоящее время, setTimeout каждый раз передается с одинаковым точным значением i, не отражая различные значения i, которые на самом деле находятся в массиве.

var a=100;
for (i in array)
{   
    setTimeout("do_stuff(i, a)"), 2000);    
}

(Я видел несколько похожих вопросов и ответов здесь, но примеры кода намного сложнее. Ответ на этот самый простой пример может сильно помочь другим с такой же проблемой. Спасибо !!!)

1 Ответ

5 голосов
/ 03 июля 2011

Чтобы использовать строку (что вы не должны делать) , вам нужно сделать это:

var a=100;
for (i in array)
{   
    setTimeout("do_stuff(" + i + ", a)"), 2000);    
}

Лучшим ответом будет область действия iпеременная в новом вызове функции, которая возвращает анонимную функцию для setTimeout().

function do_stuff( i, a ) {
    return function() {
        // do something with i and a
    }
}

var a=100;
for (i in array)
{   
    setTimeout(do_stuff( i , a ), 2000);    
}

Теперь do_stuff() возвращает функцию, имеющую ссылку в области видимости на новый i и a переменная.Поскольку каждый вызов do_stuff будет иметь свою собственную область, возвращаемая вами функция будет ссылаться на правильные значения.


РЕДАКТИРОВАТЬ: Не по теме, но если array на самом деле Array, тогда вам действительно не следует использовать for-in, потому что это предназначено для перечисления .С массивом обычно требуется итерация числовых индексов, и поэтому следует использовать стандартный цикл for.

...