【问题标题】:set time out not working with functionsettimeout 不适用于功能
【发布时间】:2013-11-23 19:10:40
【问题描述】:

我正在使用以下命令暂停 javascript 几秒钟:

 setTimeout(start_countdown(),3000);

它不起作用,无论秒数如何都会调用该函数。但是,以下函数确实有效,但不使用函数。

setTimeout(alert('hi'),3000);

我该如何解决这个问题?

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    你需要传递一个函数引用。您正在传递函数的返回值。

    不同之处在于:一个是您想要执行的功能的蓝图,另一个意味着您正在立即执行该功能并将其返回值传递给setTimeout

    setTimeout(start_countdown, 3000);
    

    如果您想做一些比简单地调用命名函数更复杂的事情,或者您想将参数传递给命名函数,则需要将匿名函数传递给超时并在其中调用您的函数:

    setTimeout(function() {
        start_countdown(/* possible params */);
        /* other code here as required */
    }, 3000);
    

    【讨论】:

    • 你能解释一下为什么我们不应该在函数setTimeout的第一个参数中添加括号吗?我注意到如果我们添加(),该函数将立即触发。这是为什么?我不知道setTimeout 的实际工作原理...
    • setTimeout 注册一个异步事件,该事件将在(大约)您指定的毫秒数内执行。它期望作为它的第一个参数 FUNCTION - 函数文字或对其他地方指定的引用。如果你传递了一个函数名,但在它后面加上(),那么你实际上是在那里执行该函数,而不是要求稍后调用该函数。你需要了解函数引用和函数调用的区别。
    【解决方案2】:

    如果你不需要传递参数,不要使用 ()

    setTimeout(start_countdown,3000);
    

    如果你这样做,你必须包装你的函数

    setTimeout(function(){start_countdown(parameter)},3000);
    

    【讨论】:

      【解决方案3】:

      改写

      setTimeout(start_countdown, 3000);
      

      没有括号()
      第二个例子也可以写成

      setTimeout(function() { alert('hi'); }, 3000);
      

      【讨论】:

        【解决方案4】:

        在不同的浏览器中,它以不同的方式工作。在 IE 中你需要使用匿名函数将参数传递给回调:

        setTimeout(function(){alert('hi')},3000);

        【讨论】:

          猜你喜欢
          • 2021-12-16
          • 2015-11-27
          • 2015-07-02
          • 2014-10-12
          • 1970-01-01
          • 2012-05-23
          • 1970-01-01
          • 1970-01-01
          • 2014-04-05
          相关资源
          最近更新 更多