我正在尝试使用
setTimeout
编写简单的代码,但是 setTimeout
只是不会等待它应该等待的时间,代码会立即执行。我做错了什么?
setTimeout(testfunction(), 2000);
您正在立即调用该函数并安排其返回值。
用途:
setTimeout(testFunction, 2000);
^
注意:没有parens.
去掉括号
setTimeout(testfunction(), 2000);
如果你想向函数发送参数,你可以创建一个匿名函数,然后调用你想要的函数。
setTimeout(function() {
testfunction('hello');
}, 2000);
编辑
有人建议发送一个字符串作为setTimeout的第一个参数。我建议不要遵循这个并且永远不要将字符串作为 setTimeout 第一个参数发送,因为将使用 eval 函数。这是不好的做法,应尽可能避免。
去掉
testfunction
名字后面的括号:
setTimeout(testfunction, 2000);
原因是
setTimeout
的第一个参数应该是一个函数reference,而不是函数的返回值。在您的代码中,立即调用testfunction
并将返回值发送给setTimeout
。
我在这里看到很多答案,但我只是想花点时间解释一下问题的根本原因。
实际上 setTimeOut() 函数是一个异步函数,当您将一个函数作为参数之一传递给 setTimeOut() 函数时,您的脚本实际上不想浪费您的时间并希望尽快执行您传递的函数。
所以有几种方法可以绕过它。您可以使用回调或承诺。
有关快速详细信息,请参阅此链接: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的新手,如果我的理解有任何差距,请告诉我。
先去掉括号:
setTimeout(testfunction, 2000);
然后,如果要在
setTimeout
函数中传递参数,可以这样传递:
setTimeout(testfunction, 2000, param1, param2);
注意: 您可以根据您的功能需求传递多个参数。
好吧,你可能已经得到了答案,但我正在解释原因和解决方案。您可以通过两种方式在所需时间后调用函数。
1. setTimeout("FUNC_NAME ()', TIME_IN_MS);
这里双引号内的 FUNC_NAME 是您要在 TIME_IN_MS 毫秒后调用的原始函数。这是因为如果你不加引号,那么在解释 java 脚本时,函数将立即执行,你的目的就会落空。为了让解释器跳过语句,我们需要在此处加上引号。
2. setTimeout(function () {FUNC_NAME ()}, TIME_IN_MS);
这里创建了匿名函数,它告诉解释器在特定时间后执行,而不是评估时间。
谢谢 沙鲁
去掉括号,当前是立即调用函数。当前传递给 setTimeout 的是 testfunction() 调用的返回值,但是您应该作为第一个参数传递给 setTimeout 的是函数引用
setTimeout(testfunction, 2000);
遇到与立即调用函数无关的问题的任何人并使用 Node.js,您的超时值可能太大导致延迟默认为 1.
例如
setTimeout(testFunction, 21474836471) == setTimeout(testFunction, 1)