【问题标题】:Why is the method executed immediately when I use setTimeout?为什么我使用 setTimeout 时方法会立即执行?
【发布时间】:2026-01-18 11:50:01
【问题描述】:

我正在尝试使用setTimeout 编写一个简单的代码,但setTimeout 只是不会等待它应该等待的时间并且代码会立即执行。我做错了什么?

setTimeout(testfunction(), 2000);

【问题讨论】:

标签: javascript settimeout


【解决方案1】:

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

用途:

setTimeout(testFunction, 2000);
                       ^

注意:没有括号。

【讨论】:

  • 好的,谢谢.. 但是有没有办法将参数发送到 setTimeout(testFunction(obj),2000) 之类的函数??!顺便说一句,这也行不通 setTimeout(alert("test"),2000)..
  • @Adler:是的:setTimeout(function() { alert("test"); }, 2000);
  • @Adler:setTimeout(alert, 2000, "test") 可以,但 IE 不支持。
  • @Adler:另见:*.com/questions/1190642/…
【解决方案2】:

去掉测试函数名后面的括号:

setTimeout(testfunction, 2000);

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

【讨论】:

  • 好的,谢谢.. 但是有没有办法将参数发送到 setTimeout(testFunction(obj),2000) 之类的函数??!顺便说一句,这也行不通 setTimeout(alert("test"),2000)...
  • @Adler 是的,您可以在延迟参数之后传递所有参数,如下所示:setTimeout(testFunction, 2000, obj)
【解决方案3】:

去掉括号

setTimeout(testfunction(), 2000);

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

setTimeout(function() {

    testfunction('hello');

}, 2000);

编辑

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

【讨论】:

    【解决方案4】:

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

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

    谢谢 夏路

    【讨论】:

      【解决方案5】:

      先去掉括号:

      setTimeout(testfunction, 2000);
      

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

       setTimeout(testfunction, 2000, param1, param2);
      

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

      【讨论】:

        【解决方案6】:

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

        setTimeout(testfunction, 2000);
        

        【讨论】:

        • 感谢您的贡献,但请解释这如何为已经存在了十年的现有答案添加任何内容。
        【解决方案7】:

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

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

        When delay is larger than 2147483647 or less than 1, the delay will be set to 1. Non-integer delays are truncated to an integer.

        【讨论】:

        • 这仅适用于 nodejs
        【解决方案8】:

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

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

        【讨论】:

          最近更新 更多