Js:没有函数参数的setTimeOut?

时间:2015-02-09 09:55:39

标签: javascript timeout settimeout

为什么我们需要将函数传递给Javascript setTimeOut https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers.setTimeout

为什么我们不能像

那样简单
setTimeOut(1000);

我可以在那里传递空或无功能吗?

我想在每次迭代后等待for循环。

4 个答案:

答案 0 :(得分:9)

Javascript是单线程的。您可以使用setTimemout推迟操作,但线程将继续。所以

function some() {
  doStuff();
  setTimeout(otherStuff, 1000);
  doMoreStuff();
}

随后会运行doStuffdoMoreStuff,并在一秒后运行otherStuff。这就是为什么使用setTimeout作为延迟本身是无用的,也是不可能的。如果doMoreStuff应该推迟,您应该将延迟回调:

function some() {
  doStuff();
  setTimeout(doMoreStuff, 1000);
}

otherstuffdoMoreStuff延迟:

function some() {
  doStuff();
  setTimeout(function () {
               otherStuff();
               doMoreStuff()
             }, 1000);
}

也许我对this SO-question的回答也很有用。

答案 1 :(得分:2)

setTimeout在事件循环中注册一个偶数。当JavaScript完成所有当前指令后,它将返回事件循环并等待事件发生。当它这样做时,它会调用回调函数,这是你传递给setTimeout的函数。

要使用setTimeout执行for循环,请执行以下操作:

function loop(i, n) {
    doStuff();
    if (i < n) {
        setTimeout(function() {
            loop(i+1, n);
        }, 1000);
    }
};
loop(0, 10);

其中i是当前迭代,n是最大迭代

当JavaScript不在事件循环中时,即它正在运行代码时,它会使整个浏览器无响应。只是闲置一秒就可以做到这一点,所以如果你在一个循环上迭代10次,浏览器就会没有响应10秒

答案 2 :(得分:1)

- &gt; setTimeout(callbackFunction[, interval])

这可以理解,因为您将在指定时间后调用具有指定名称(由您指定)的函数。

- &gt; 你不能这样做setTimeOut(1000);因为1000会被视为回调函数因为setTimeout()的第一个参数是回调函数。

您无法定义类似

的功能

function 1000() { // Code Resides here. }

因为java脚本不允许这些类型的函数名称。

- &gt; 您可以将匿名函数传递给setTimeout(),如

setTimeout(function() { // Code resides here. }[, interval]); 上述功能代码将在给定间隔后执行。如果没有给出间隔,那么它将立即执行。

注意: - 方括号 [,] 中的参数是可选的。

<强> - &GT;您可以参考以下提到的主题供您使用: JavaScript sleep/wait before continuing

由于此线程包含的函数定义与其他语言中的sleep()类似。

答案 3 :(得分:0)

现在可以通过快速的一行在Await / Async中实现:

await new Promise(resolve => setTimeout(resolve, 1000));

还有一个我认为与之相关的问题 Combination of async function + await + setTimeout