setTimeout - как избежать использования строки для обратного вызова? - PullRequest
12 голосов
/ 28 апреля 2009

При использовании setTimeout вы должны поместить код, который вы хотите выполнить, в строку:

setTimeout('alert("foobar!");', 1000);

Однако я хочу выполнить функцию, на которую у меня есть ссылка в переменной. Я хочу быть в состоянии сделать это:

var myGreatFunction = function() { alert("foobar!"); };
// ...
setTimeout('myGreatFunction();', 1000);

(Хотя в реальной жизни предупреждение является более длинным фрагментом кода, и myGreatFunction передается как параметр другим функциям, в которых вызывается setTimeout.)

Конечно, когда срабатывает тайм-аут, myGreatFunction не является распознанной функцией, поэтому она не выполняется.

Я бы хотел, чтобы JavaScript позволил мне это сделать, но это не так:

setTimeout(function() { myGreatFunction(); }, 1000);

Есть ли хороший способ обойти это?

Ответы [ 2 ]

29 голосов
/ 28 апреля 2009

Если вам не нужно вызывать myGreatFunction с какими-либо аргументами, вы сможете передать setTimeout ссылку на функцию:

setTimeout(myGreatFunction, 1000);

Кроме того, вы всегда должны избегать передачи setTimeout кода, который необходимо оценить (что происходит, когда вы заключаете код в кавычки). Вместо этого оберните код в анонимную функцию:

setTimeout(function() {
    // Code here...
}, 1000);

Для получения дополнительной информации см. Страницу setTimeout в Центре разработки Mozilla .

Steve

14 голосов
/ 28 апреля 2009

Кто сказал, что это не позволяет тебе это сделать?

Да, код -

setTimeout(function() { myFunction(); }, 1000);

совершенно верно.

...