2010-08-09 3 views
2

Это код из другого потока. Он активирует функцию только тогда, когда пользователь прекратил печатать после установленного времени.javascript settimeout cleartimeout regular syntax

var keyupTimer; 
function keyUpEvent(){ 
    clearTimeout(keyupTimer); 
    keyupTimer = setTimeout(sendInput,1000); // will activate when the user has stopped typing for 1 second 
} 

function sendInput(){ 
    alert("Do AJAX request"); 
} 

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

keyupTimer = setTimeout(sendInput,1000); //original code 

К

keyupTimer = setTimeout(sendInput(),1000); //with just empty() 

или

keyupTimer = setTimeout(sendInput(var),1000);//or with ('test') or with (var) 

с скобкой, задержка не и функция sendInput вызывается немедленно. Это единственный формат для этой конкретной процедуры?

ТИА

ответ

1

вы можете попробовать

keyupTimer = setTimeout(function() 
{ 
    sendInput('test'); 
},1000); 

поэтому имеют анонимную функцию в качестве параметра для «SetTimeout»

+0

Спасибо, Алекс. – jamex

3

keyupTimer = SetTimeout (SendInput, 1000); // исходный код

Это говорит: «Запустите sendInput через 1000 мс»;

keyupTimer = setTimeout (sendInput(), 1000); // только с пустым()

Это говорит: «Запустите sendInput, возьмите возвращаемое значение (которое должно быть функцией) и запустите его после 1000 мс».

sendInput является функцией, sendInput() является функцией call.

+0

Спасибо Дэвиду за разъяснения. Итак, каков будет синтаксис «Запуск sendInput (с параметрами) после 1000 мсек»? – jamex

+3

Кроме того, чтение-между строками: если то, что действительно хочет OP, - это передать параметр функции обратного вызова, лучший способ кросс-браузера - использовать закрытие для захвата переменной: 'setTimeout (function() {SendInput (вар)}, 1000) '. – slebetman

+0

Спасибо, слетбетман. – jamex

2

Первый аргумент для setTimeout является ссылкой на функцию (т. Е. Переменная, указывающая на вашу функцию). Вы предоставляете вызов функции. Чтобы передать функцию с аргументами, завершите вызов функции анонимной функцией. Вы можете передать его непосредственно в setTimeout в качестве аргумента, поскольку функции JavaScript являются первоклассными объектами.

keyupTimer = setTimeout(function() { 
    sendInput(var); 
}, 1000); 

В более многословным, которая равна этому:

var callback = function() { 
    sendInput(var); 
} 
keyupTimer = setTimeout(callback, 1000); 

Рядный шаблон имеет свое преимущество, что он имеет доступ к области действия, где setTimeout называется.

Если вам это подходит, вы даже можете создать фабрику обратного вызова, чтобы передать вызов функции setTimeout, как указано @slebetman.

function callbackFactory (var) { 
    return function() { 
     sendInput(var); 
    } 
}; 
setTimeout(callbackFactory('some_value'), 1000); 
+2

Еще один, лучший, более подробный пример - использовать фабрику функций (как и фабрику объектов из заводского шаблона): 'function callbackFactory (var) {return function() {sendInput (var)}}; setTimeout (callbackFactory ('some_value'), 1000); ' – slebetman

+0

Спасибо Torok. Странно, мое предыдущее спасибо, что не появилось. – jamex

0

также можно использовать строку, содержащую код яваскрипта, в качестве первого аргумента setTimeout ,однако, настоятельно рекомендуется (см. комментарии)

... 
/* DON'T DO THIS: */ 
keyupTimer = setTimeout("sendInput(variable)", 1000) 
... 
+3

Не очень хорошая идея, потому что 1: это скользкий склон к цитированию ада, 2: «строковый код» должен быть перекомпилирован каждый раз, 3: каждый раз, когда вы составляете код из строки, Джон Скит убивает котенка – slebetman

+0

Спасибо, Михал. Позвольте мне попробовать, но я, вероятно, буду использовать метод длинной руки, чтобы я помню, почему. – jamex

+0

Пожалуйста, не распространяйте плохую практику как ответ! –

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