【问题标题】:Why is JavaScript's Set Timeout not working? [closed]为什么 JavaScript 设置超时不起作用? [关闭]
【发布时间】:2022-04-12 02:11:11
【问题描述】:

我正在尝试使用 setTimeout,但它不起作用。任何帮助表示赞赏。

有人知道如何解决这个问题吗?

var button = document.getElementById("reactionTester");
var start  = document.getElementById("start");

function init() {
    var startInterval/*in milliseconds*/ = 1000;
    setTimeout(startTimer(), startInterval);
}

function startTimer() {
    document.write("hey");
}

【问题讨论】:

标签: javascript


【解决方案1】:

这一行:

setTimeout(startTimer(), startInterval); 

您正在调用startTimer()。相反,您需要将其作为要调用的函数传入,如下所示:

setTimeout(startTimer, startInterval);

【讨论】:

  • 是的,正如@j08691 所指出的——保留括号会立即触发函数调用。这误导了我,因为调用该函数时没有任何错误或控制台警告,所以我并不怀疑我是如何使用 setTimeout() 的,而是怀疑我是如何确定它的范围的,等等。这让我发疯了。谢谢你们。
  • 如果必须传入变量怎么办?
  • @Jeff 你会把它包在一个闭包里。 setTimeout(function() { startTimer(parm1); }, startInterval);查看更多信息...stackoverflow.com/questions/7176292/…
【解决方案2】:

如果您需要将参数传递给要在超时后执行的函数,您可以将“命名”函数包装在匿名函数中。

即作品

setTimeout(function(){ startTimer(p1, p2); }, 1000);

即不会工作,因为它会立即调用该函数

setTimeout( startTimer(p1, p2), 1000);

【讨论】:

    【解决方案3】:

    两件事。

    1. 删除setTimeout(startTimer(),startInterval); 中的括号。保留括号会立即调用函数。

    2. 您的 startTimer 函数将使用 document.write 覆盖页面内容(没有上述修复),并在此过程中清除脚本和 HTML。

    【讨论】:

    • 如果必须传入变量怎么办?
    • @Jeff - 你能详细说明一下吗?
    • 抱歉,措辞不好。我想出了我想要做什么......我试图传递一个需要变量作为我的第一个参数的函数。我只是将它包装在一个匿名函数中。
    【解决方案4】:

    如果要给延迟函数传递参数:

        setTimeout(setTimer, 3000, param1, param2);
    

    【讨论】:

      【解决方案5】:

      用途:

      setTimeout(startTimer,startInterval); 
      

      您正在调用 startTimer() 并将其结果(未定义)作为参数提供给 setTimeout()。

      【讨论】:

        【解决方案6】:

        请将您的代码更改如下:

        <script>
            var button = document.getElementById("reactionTester");
            var start = document.getElementById("start");
            function init() {
                var startInterval/*in milliseconds*/ = Math.floor(Math.random()*30)*1000;
                setTimeout(startTimer,startInterval); 
            }
            function startTimer(){
                document.write("hey");
            }
        </script>
        

        看看是否有帮助。基本上,区别在于引用了 'startTimer' 函数而不是执行它。

        【讨论】:

          【解决方案7】:

          为了让下面的用法更容易理解,我最喜欢这个。它还允许一次调用多个函数。很明显

          setTimeout(function(){
                startTimer();
                function2();
                function3();
          }, startInterval);
          

          【讨论】:

            猜你喜欢
            • 2011-10-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-02-15
            • 2018-02-15
            • 2017-12-13
            相关资源
            最近更新 更多