javascript settimeout cleartimeout рутинный синтаксис - PullRequest
2 голосов
/ 09 августа 2010

Это код из другого потока.Функция активируется только тогда, когда пользователь прекратил печатать по истечении заданного времени.

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 вызывается немедленно.Это единственный формат для этой конкретной процедуры?

TIA

Ответы [ 4 ]

3 голосов
/ 09 августа 2010

keyupTimer = setTimeout (sendInput, 1000);// оригинальный код

Здесь написано «Запустить sendInput через 1000 мс»;

keyupTimer = setTimeout (sendInput (), 1000);// просто empty ()

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

sendInput - это функция, sendInput() - это функция , вызов .

2 голосов
/ 09 августа 2010

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

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

В более подробном изложении это равно:Преимущество шаблона в том, что он имеет доступ к области действия, в которой вызывается setTimeout.

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

function callbackFactory (var) {
    return function() {
        sendInput(var);
    }
};
setTimeout(callbackFactory('some_value'), 1000);
1 голос
/ 09 августа 2010

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

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

, поэтому используйте анонимную функцию в качестве параметра для 'setTimeout'

0 голосов
/ 09 августа 2010

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

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