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

q35jwt9p  于 2023-03-28  发布在  Java
关注(0)|答案(8)|浏览(303)

我试图用setTimeout写简单的代码,但是setTimeout不能等待它应该等待的时间,代码立即执行。我做错了什么?

setTimeout(testfunction(), 2000);
wkftcu5l

wkftcu5l1#

您将立即调用该函数并调度其返回值。
用途:

setTimeout(testFunction, 2000);
                       ^

注意:没有括号。

cwxwcias

cwxwcias2#

去掉括号

setTimeout(testfunction(), 2000);

如果你想给函数发送参数,你可以创建一个匿名函数,然后调用你想要的函数。

setTimeout(function() {

    testfunction('hello');

}, 2000);

编辑

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

ukdjmx9f

ukdjmx9f3#

删除testfunction名称后面的括号:

setTimeout(testfunction, 2000);

原因是setTimeout的第一个参数应该是一个函数 reference,而不是函数的返回值。在您的代码中,testfunction被立即调用,返回值被发送到setTimeout

pdtvr36n

pdtvr36n4#

我在这里看到了很多答案,但我只想花一些时间来解释问题的根本原因。
实际上,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,请让我知道,如果有任何差距,我的理解。

oo7oh9g9

oo7oh9g95#

首先去掉括号:

setTimeout(testfunction, 2000);

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

setTimeout(testfunction, 2000, param1, param2);

**注意:**您可以根据自己的功能需求传递多个参数。

rta7y2nd

rta7y2nd6#

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

  1. setTimeout(“FUNC_NAME()',TIME_IN_MS);
    这里,双引号内的FUNC_NAME是您要在TIME_IN_MS毫秒后调用的原始函数。这是因为如果您不加引号,那么在解释java脚本时,该函数将立即执行,您的目的将落空。为了让解释器跳过语句,我们需要在此处加引号。
  2. setTimeout(function(){FUNC_NAME()},TIME_IN_MS);
    这里创建了一个匿名函数,告诉解释器在一定时间后执行if,而不是计算时间。
    谢谢shaILU
v7pvogib

v7pvogib7#

去掉括号,当前你是立即调用函数,当前传递给setTimeout的是testfunction()调用的返回值,但是你应该作为第一个参数传递给setTimeout的是函数引用

setTimeout(testfunction, 2000);
20jt8wwn

20jt8wwn8#

任何遇到与立即调用函数和使用Node.js无关的问题的人,您的超时值可能太大,导致延迟默认为1。
例如setTimeout(testFunction, 21474836471) == setTimeout(testFunction, 1)
当延迟大于2147483647或小于1时,延迟将被设置为1。非整数延迟将被截断为整数。

相关问题