javascript settimeout cleartimeout例程语法

时间:2010-08-09 06:00:13

标签: javascript settimeout

这是另一个线程的代码。只有当用户在设定的时间后停止输入时,它才会激活一个功能。

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 个答案:

答案 0 :(得分:3)

  

keyupTimer = setTimeout(sendInput,1000); //原始代码

这表示“在1000ms后运行sendInput”;

  

keyupTimer = setTimeout(sendInput(),1000); //只用空()

这表示“运行sendInput,捕获返回值(应该是一个函数)并在1000ms之后运行”。

sendInput是一个函数,sendInput()是一个函数调用

答案 1 :(得分: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 :(得分:1)

你可以尝试

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

所以有一个匿名函数作为'setTimeout'

的参数

答案 3 :(得分:0)

也可以使用包含javascript代码的字符串作为setTimeout的第一个参数。但是,强烈建议不要这样做(见评论)

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