为什么使用 setTimeout 时会立即执行该函数?

Why is the function executed immediately when I use setTimeout?

提问人:Adler 提问时间:8/21/2011 最后编辑:Ry-Adler 更新时间:3/26/2023 访问量:53727

问:

我正在尝试使用 ,但 不会等待它应该等待的时间,代码会立即执行。我做错了什么?setTimeoutsetTimeout

setTimeout(testfunction(), 2000);
JavaScript 设置超时

评论

0赞 Šime Vidas 8/21/2011
()在这里充当调用运算符。但是你想把函数传递给 ,而不是调用它。setTimeout
2赞 outis 11/10/2011
为什么我的函数调用被 setTimeout 调度立即执行?,使用 setTimeout() 调用函数,Javascript setTimeout() 忽略了超时长度

答:

164赞 Mat 8/21/2011 #1

您将立即调用该函数并计划其返回值。

用:

setTimeout(testFunction, 2000);
                       ^

注意:没有 parens。

评论

3赞 Adler 8/21/2011
好的,谢谢。。但是有没有办法将参数发送到像 setTimeout(testFunction(obj),2000) 这样的函数??!顺便说一句,这也行不通 setTimeout(alert(“test”),2000)。
37赞 T.J. Crowder 8/21/2011
@Adler: 是的:setTimeout(function() { alert("test"); }, 2000);
3赞 pimvdb 8/21/2011
@Adler:可以这样做,但IE不支持。setTimeout(alert, 2000, "test")
0赞 Mat 8/21/2011
@Adler:参见:stackoverflow.com/questions/1190642/...
9赞 Emil Vikström 8/21/2011 #2

删除名称后面的括号:testfunction

setTimeout(testfunction, 2000);

原因是第一个参数应该是函数引用,而不是函数的返回值。在代码中,立即调用,并将返回值发送到 。setTimeouttestfunctionsetTimeout

评论

0赞 Adler 8/21/2011
好的,谢谢。。但是有没有办法将参数发送到像 setTimeout(testFunction(obj),2000) 这样的函数??!顺便说一句,这也行不通 setTimeout(alert(“test”),2000)...
0赞 Brandon McConnell 5/30/2021
@Adler是的,您可以在 delay 参数之后传递所有参数,如下所示:setTimeout(testFunction, 2000, obj)
32赞 Jose Faeti 8/21/2011 #3

去掉括号

setTimeout(testfunction(), 2000);

如果要向函数发送参数,可以创建一个匿名函数,然后该函数将调用所需的函数。

setTimeout(function() {

    testfunction('hello');

}, 2000);

编辑

有人建议发送一个字符串作为 setTimeout 的第一个参数。我建议不要遵循这一点,也不要发送字符串作为 setTimeout 的第一个参数,因为将使用 eval 函数。这是不好的做法,如果可能的话,应该避免。

2赞 shaILU 8/21/2011 #4

好吧,您可能已经得到了答案,但我正在解释原因和解决方案。有两种方法可以在所需时间后调用函数。

1. setTimeout(“FUNC_NAME ()', TIME_IN_MS);
这里FUNC_NAME双引号内是要在 TIME_IN_MS 毫秒后调用的原始函数。这是因为如果你不加引号,那么当 java 脚本被解释时,该函数将立即执行,你的目的将被击败。为了让解释器跳过语句,我们需要在这里加上引号。
2. setTimeout(函数() {FUNC_NAME ()}, TIME_IN_MS);
这里创建了匿名函数,告诉解释器在一定时间后执行 if,而不是评估时间。

谢谢 沙伊鲁

3赞 Shraddha 9/27/2020 #5

首先去掉括号:

setTimeout(testfunction, 2000);

然后,如果你想在函数中传递参数,你可以这样传递:setTimeout

 setTimeout(testfunction, 2000, param1, param2);

注意:您可以根据函数需求传递多个参数。

1赞 Jonathan Utsu Undelikwo 12/1/2020 #6

删除括号,当前您正在立即调用该函数。当前传递给 setTimeout 的是 testfunction() 调用的返回值,但您应该作为第一个参数传递给 setTimeout 的是函数引用

setTimeout(testfunction, 2000);

评论

0赞 ggorlen 8/1/2021
感谢您的贡献,但请解释一下这如何为已经存在了十年的现有答案添加任何内容。
1赞 mdeforestbrown 9/8/2021 #7

任何遇到与立即调用函数和使用 Node.js 无关的问题的人,您的超时值可能太大,导致延迟默认为 1。

例如:setTimeout(testFunction, 21474836471) == setTimeout(testFunction, 1)

当延迟大于 2147483647 或小于 1 时,延迟将设置为 1。非整数延迟被截断为整数。

评论

2赞 Andreas 9/15/2021
这仅适用于 nodejs
0赞 ckhatton 8/31/2023
我在 2500000000 毫秒(大约 29 天)左右设置了相同的延迟
4赞 Shubham Arya 10/18/2021 #8

我在这里看到了很多答案,但我只想花一些时间来解释问题的根本原因。

实际上 setTimeOut() 函数是一个异步函数,当您将函数作为参数之一传递给 setTimeOut() 函数时,您的脚本实际上不想浪费您的时间并希望尽快执行您传递的函数。

因此,有几种方法可以绕过这一点。您可以使用回调或 promise。

有关快速详细信息,请参阅此链接:https://www.w3schools.com/js/js_promise.asp

我将向您展示如何使用回调来实现您想要实现的目标。

通过做 -

setTimeOut(your_function_name_without_parentheses, <number of milliseconds>)

你实际上可以告诉你的超时,请先执行你自己,然后执行我作为第一个参数传递的回调函数。

或者如果你想把一个参数传递给回调函数,你可以做这样的事情——

setTimeOut(() => {your_function_name_with_parentheses(argument_that_you_want_to_pass), <number of milliseconds>})

上面已经回答了其他方法。

另外,我是JS的新手,如果我的理解有任何差距,请告诉我。