繁体   English   中英

javascript settimeout cleartimeout例程语法

[英]javascript settimeout cleartimeout routine 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函数。 这是此特定例程的唯一格式吗?

TIA

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

这说:“在1000ms之后运行sendInput”;

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

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

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

setTimeout的第一个参数是函数引用(即,指向您函数的变量)。 您提供的是一个函数调用。 要传递带有参数的函数,请将函数调用包装在匿名函数中。 由于JavaScript函数是一类对象,因此您可以将其作为参数直接传递给setTimeout

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);

你可以试试

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

因此,请使用匿名函数作为“ setTimeout”的参数

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM