2013-11-15 8 views
9

В чем разница между этим:Как передать параметр для обратного вызова setTimeout()?

function blankWord(){ 
    console.log('blank!'); 
    setTimeout(blankWord, 5000); 
} 
blankWord(); 

Что вызывает функцию каждые 5 секунд, как и должно быть, и это:

function blankWord(t){ 
    console.log('blank!'); 
    setTimeout(blankWord, t); 
} 
blankWord(5000); 

Что вызывает функцию несколько раз безумно быстро?

+2

'setTimeout (blankWord, 5000, 'word')'? – putvande

+1

Ответил подробно на [Как передать параметр в callbackTimeout()?] (Http://stackoverflow.com/questions/1190642/how-can-i-pass-a-parameter-to-a-settimeout- обратный вызов) –

ответ

8

Поскольку вам не хватает параметра во второй форме, вы передаете undefined со второго вызова, что, по сути, приведет к таймауту 4 мс (which is the browser minimum).

Используйте функцию обертку, чтобы безопасно передавать параметры, необходимые:

function blankWord(t){ 
    console.log('blank!'); 
    setTimeout(function(){blankWord(t)},t); 
} 
blankWord(5000); 

Передача параметров в третий параметры выбивает старые ИЭ, поэтому вы не должны использовать это до тех пор, пока IE8 мертв.

6

Первый скрипт вызывает setTimeout со вторым аргументом 5000 каждый раз.

Второй скрипт называет его t. Первый раз это 5000 (от blankWord(5000);). Каждое последующее время это undefined (от setTimeout(blankWord).

Если вы хотите передать аргументы, сделайте это, передав их в массив в качестве третьего аргумента setTimeout.

setTimeout(blankWord, t, [t]) 

См mdn for a polyfill для поддержки старых браузеров, которые не распознают три аргумента формы функции.

+0

с использованием третьего параметра - плохая идея, потому что он не поддерживается всеми браузерами, вместо этого используйте оболочку функции. – Christoph

+0

Почему бы и нет? Не поддерживается во всех браузерах? ( putvande

+3

@putvande Конечно. IE8 (к сожалению) все еще используется. – Christoph

Смежные вопросы