提问人:Adler 提问时间:8/21/2011 最后编辑:Ry-Adler 更新时间:3/26/2023 访问量:53727
为什么使用 setTimeout 时会立即执行该函数?
Why is the function executed immediately when I use setTimeout?
问:
我正在尝试使用 ,但 不会等待它应该等待的时间,代码会立即执行。我做错了什么?setTimeout
setTimeout
setTimeout(testfunction(), 2000);
答:
您将立即调用该函数并计划其返回值。
用:
setTimeout(testFunction, 2000);
^
注意:没有 parens。
评论
setTimeout(function() { alert("test"); }, 2000);
setTimeout(alert, 2000, "test")
删除名称后面的括号:testfunction
setTimeout(testfunction, 2000);
原因是第一个参数应该是函数引用,而不是函数的返回值。在代码中,立即调用,并将返回值发送到 。setTimeout
testfunction
setTimeout
评论
setTimeout(testFunction, 2000, obj)
去掉括号
setTimeout(testfunction(), 2000);
如果要向函数发送参数,可以创建一个匿名函数,然后该函数将调用所需的函数。
setTimeout(function() {
testfunction('hello');
}, 2000);
编辑
有人建议发送一个字符串作为 setTimeout 的第一个参数。我建议不要遵循这一点,也不要发送字符串作为 setTimeout 的第一个参数,因为将使用 eval 函数。这是不好的做法,如果可能的话,应该避免。
好吧,您可能已经得到了答案,但我正在解释原因和解决方案。有两种方法可以在所需时间后调用函数。
1. setTimeout(“FUNC_NAME ()', TIME_IN_MS);
这里FUNC_NAME双引号内是要在 TIME_IN_MS 毫秒后调用的原始函数。这是因为如果你不加引号,那么当 java 脚本被解释时,该函数将立即执行,你的目的将被击败。为了让解释器跳过语句,我们需要在这里加上引号。
2. setTimeout(函数() {FUNC_NAME ()}, TIME_IN_MS);
这里创建了匿名函数,告诉解释器在一定时间后执行 if,而不是评估时间。
谢谢 沙伊鲁
首先去掉括号:
setTimeout(testfunction, 2000);
然后,如果你想在函数中传递参数,你可以这样传递:setTimeout
setTimeout(testfunction, 2000, param1, param2);
注意:您可以根据函数需求传递多个参数。
删除括号,当前您正在立即调用该函数。当前传递给 setTimeout 的是 testfunction() 调用的返回值,但您应该作为第一个参数传递给 setTimeout 的是函数引用
setTimeout(testfunction, 2000);
评论
任何遇到与立即调用函数和使用 Node.js 无关的问题的人,您的超时值可能太大,导致延迟默认为 1。
例如:setTimeout(testFunction, 21474836471) == setTimeout(testFunction, 1)
当延迟大于 2147483647 或小于 1 时,延迟将设置为 1。非整数延迟被截断为整数。
评论
我在这里看到了很多答案,但我只想花一些时间来解释问题的根本原因。
实际上 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的新手,如果我的理解有任何差距,请告诉我。
评论
()
在这里充当调用运算符。但是你想把函数传递给 ,而不是调用它。setTimeout