只是出于好奇 - 有人可以向我解释setTimeout()的奇怪之处吗?

时间:2012-02-11 20:11:54

标签: javascript settimeout

奇怪的是,我的意思是这两件事:

  1. 第一个参数中的函数需要被包围 报价,否则延迟设置为0(一切都已执行 即刻)。
  2. 超时后的所有内容都需要延迟     好吧,否则它会在超时完成之前执行。
  3. 如果有一种绕过#2的方式 - 这会很棒,但是现在我只是对此感到好奇。

    简短的片段来解释我在说什么:

    for (var i=0; i<10; i++) setTimeout("addInput('.')",i*500);
    setTimeout('addInput("</br>")',5100);
    

    在上面,除非addInput('。')被引号括起,否则忽略延迟并且只执行代码;除非我在第二行添加超时,否则它将在第一次超时完成之前执行。

3 个答案:

答案 0 :(得分:5)

  

第一个参数中的函数需要用引号括起来,   或者延迟设置为0(一切都立即执行)。

不一定。实际上建议使用直接使用函数指针而不是字符串的重载来避免解析它的开销:

for (var i=0; i<10; i++) {
    setTimeout(function() {
        addInput('.');
    }, i * 500);
}

或其等价物(警告:在IE中不起作用):

for (var i=0; i<10; i++) {
    setTimeout(addInput, i * 500, '.');
}

以下setTimeout重载是最常用的重载:

var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);

答案 1 :(得分:4)

setTimeout采用函数引用。这意味着你需要传递函数或匿名函数的名称,而不是执行函数的结果。

这样可行:

setTimeout(fn, 1000);

但是,这不是:

setTimeout(fn(), 1000);

第二个示例立即执行fn()并将该函数的返回值传递给setTimeout(),这通常不是您想要的(没有延迟)。

如果你需要将一个参数传递给你的函数,那么你需要将它包装在这样的容器函数中,因为setTimeout将调用你的函数而没有参数:

setTimeout(function() {addInput('.')}, i*500);

答案 2 :(得分:0)

  1. 那是因为您首先调用该函数,然后将返回值发送到setTimeout方法。您只需使用函数名称,或者如果需要发送参数,请创建一个匿名函数:

    setTimeout(function(){addInput('。')},i * 500);

  2. setTimeout方法不会延迟代码,它会将代码放入计时器的回调中。 setTimeout电话后面的代码会立即生效。