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

问题描述 投票:0回答:8

我正在尝试使用

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

setTimeout(testfunction(), 2000);
javascript settimeout
8个回答
161
投票

您正在立即调用该函数并安排其返回值。

用途:

setTimeout(testFunction, 2000);
                       ^

注意:没有parens.


32
投票

去掉括号

setTimeout(testfunction(), 2000);

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

setTimeout(function() {

    testfunction('hello');

}, 2000);

编辑

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


9
投票

去掉

testfunction
名字后面的括号:

setTimeout(testfunction, 2000);

原因是

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


4
投票

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

实际上 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的新手,如果我的理解有任何差距,请告诉我。


3
投票

先去掉括号:

setTimeout(testfunction, 2000);

然后,如果要在

setTimeout
函数中传递参数,可以这样传递:

 setTimeout(testfunction, 2000, param1, param2);

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


2
投票

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

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

谢谢 沙鲁


1
投票

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

setTimeout(testfunction, 2000);

0
投票

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

例如

setTimeout(testFunction, 21474836471) == setTimeout(testFunction, 1)

当delay大于2147483647或小于1时,delay会被设置为1。非整数的delay被截断为整数。

© www.soinside.com 2019 - 2024. All rights reserved.