Javascript 出于好奇-有人能给我解释一下setTimeout()的奇怪之处吗?

Javascript 出于好奇-有人能给我解释一下setTimeout()的奇怪之处吗?,javascript,settimeout,Javascript,Settimeout,我所说的怪事是指以下两件事: 第一个参数中的函数需要用 引用,否则延迟设置为0,所有操作都将执行 马上。 超时后的所有内容都需要有一个延迟,如下所示 好吧,否则它是在超时完成之前执行的。 如果有办法解决2-那就太棒了,但现在我只是对这个很好奇 解释我所说内容的简短片段: for (var i=0; i<10; i++) setTimeout("addInput('.')",i*500); setTimeout('addInput("</br>")',5100); 在上面的例子

我所说的怪事是指以下两件事:

第一个参数中的函数需要用 引用,否则延迟设置为0,所有操作都将执行 马上。 超时后的所有内容都需要有一个延迟,如下所示 好吧,否则它是在超时完成之前执行的。 如果有办法解决2-那就太棒了,但现在我只是对这个很好奇

解释我所说内容的简短片段:

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

在上面的例子中,除非addInput“.”被引号包围,否则延迟将被忽略,代码将被执行;另外,除非我在第二行中添加超时,否则它将在第一个超时完成之前执行。

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

所以这是可行的:

setTimeout(fn, 1000);
但是,这并不是:

setTimeout(fn(), 1000);
第二个示例立即执行fn,并将该函数的返回值传递给setTimeout,而setTimeout通常不是您希望得到的值—没有延迟

如果需要将参数传递给函数,则需要将其包装在如下容器函数中,因为setTimeout将不带参数地调用函数:

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

setTimeout接受函数引用。这意味着您需要向它传递函数或匿名函数的名称,而不是执行函数的结果

所以这是可行的:

setTimeout(fn, 1000);
但是,这并不是:

setTimeout(fn(), 1000);
第二个示例立即执行fn,并将该函数的返回值传递给setTimeout,而setTimeout通常不是您希望得到的值—没有延迟

如果需要将参数传递给函数,则需要将其包装在如下容器函数中,因为setTimeout将不带参数地调用函数:

setTimeout(function() {addInput('.')}, i*500);
第一个参数中的函数需要用引号括起来, 否则延迟设置为0,所有操作立即执行

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

for (var i=0; i<10; i++) {
    setTimeout(function() {
        addInput('.');
    }, i * 500);
}
第一个参数中的函数需要用引号括起来, 否则延迟设置为0,所有操作立即执行

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

for (var i=0; i<10; i++) {
    setTimeout(function() {
        addInput('.');
    }, i * 500);
}
这是因为您首先调用函数,然后将返回值发送到setTimeout方法。您可以只使用函数名,或者如果需要发送参数,则创建一个匿名函数:

setTimeoutfunction{addInput'.},i*500

setTimeout方法不会延迟代码,而是将代码放入计时器的回调中。setTimeout调用之后的代码立即出现

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

setTimeoutfunction{addInput'.},i*500

setTimeout方法不会延迟代码,而是将代码放入计时器的回调中。setTimeout调用之后的代码立即出现


加引号中的addInput'.'是一个字符串声明,没有函数调用。加引号中的addInput'.'是一个字符串声明,没有函数调用。请注意,在IE中调用时,将额外参数传递给setTimeout以传递给回调。@josh3736,感谢您指出这一点。我已经更新了我的答案,包含了这些有价值的信息。非常有趣,谢谢!你对我问题的第二部分也有答案吗或者按照建议正确使用该函数可以解决这个问题吗?请注意,在IE@josh3736中调用时,将额外的参数传递给setTimeout以传递给回调,感谢您指出这一点。我已经更新了我的答案,包含了这些有价值的信息。非常有趣,谢谢!你对我问题的第二部分也有答案吗或者按照建议正确使用函数可以解决这个问题吗?