javascript setTimeout() 不起作用

IT技术 javascript
2021-03-13 17:23:31

嗨,我正在尝试在 javascript 中使用 setTimeout() 函数,但它不起作用。提前感谢任何可以提供帮助的人。

<!DOCTPYE html>
<html>
<head>
    <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>
</head>
<body>
<form id="form">
    <input type="button id=" reactionTester" onclick="stopTimer()">
    <input type="button" value="start" id="start" onclick="init()">
</form>
</body>
</html>
6个回答

这一行:

setTimeout(startTimer(), startInterval); 

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

setTimeout(startTimer, startInterval);
@Jeff 你会把它包在一个闭包里。 setTimeout(function() { startTimer(parm1); }, startInterval); 有关更多信息,请参见此处... stackoverflow.com/questions/7176292/ ...
2021-04-23 17:23:31
是的,正如@j08691 所指出的那样——保留括号会立即触发函数调用。这误导了我,因为调用该函数时没有任何错误或控制台警告,所以我并不怀疑我如何使用setTimeout(),而是我如何确定它的范围等等。这让我发疯。谢谢你们俩。
2021-04-28 17:23:31
如果必须传入一个变量怎么办?
2021-04-29 17:23:31

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

即作品

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

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

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

两件事情。

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

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

如果必须传入一个变量怎么办?
2021-05-06 17:23:31
抱歉,措辞不好。我想出了我想要做什么...我试图传递一个需要一个变量作为我的第一个参数的函数。我只是将它包装在一个匿名函数中。
2021-05-07 17:23:31
@Jeff - 你能详细说明一下吗?
2021-05-11 17:23:31

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

    setTimeout(setTimer, 3000, param1, param2);

利用:

setTimeout(startTimer,startInterval); 

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