SetTimeout - как избежать использования строки для обратного вызова?

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

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

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

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

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

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

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

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

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

Ответ 1

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

setTimeout(myGreatFunction, 1000);

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

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

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

Стив

Ответ 2

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

Он делает, код -

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

отлично.