JavaScript 中的 setTimeout 功能

setTimeout Functionality in JavaScript

我试图理解 setTimeout 的概念,但我不明白它是如何工作的。在下面的示例中,当我将 1000 赋给第二个 setTimeout 函数时,我得到的输出为

1)你好567
2)你好
3)你好123

但是当我将所有函数的 setTimeout 设为 0 时,它显示为

1)你好123
2)你好567
3)你好

最初,我假设先返回内部函数值然后在下面的情况下不应该

1)你好567
2)你好123
3)你好

请帮我理解

<!DOCTYPE html>
<html>

<body>

  <p>Click the button to wait 3 seconds, then alert "Hello".</p>

  <button onclick="myFunction()">Try it</button>

  <script>
    function myFunction() {
      setTimeout(function() {
        alert("Hello");
      }, 0, setTimeout(function() {
        alert("Hello 123");
      }, 0), setTimeout(function() {
        alert("Hello 567");
      }, 0));
    }
  </script>

</body>

</html>

我不知道您将第三个和第四个参数传递给 setTimeout 是什么意思,但它显然在根 setTimeout.

之前求值

澄清一下,根 setTimeout 的第 3 个和第 4 个参数是其他 setTimeout 调用的结果,因此需要先对它们进行求值,然后再将它们的结果传递给根 setTimeout.

您没有结束与 ) 的第一个 setTimeout() 通话。

您现在可以看到它们 运行 按照它们被调用的顺序排列,也就是它们放置在事件队列中的顺序。

<!DOCTYPE html>
<html>

<body>

  <p>Click the button to wait 3 seconds, then alert "Hello".</p>

  <button onclick="myFunction()">Try it</button>

  <script>
    function myFunction() {
      setTimeout(function() {
        alert("Hello 1");
      }, 0)
      , setTimeout(function() {
        alert("Hello 2");
      }, 0)
      , setTimeout(function() {
        alert("Hello 3");
      }, 0);
    }
  </script>

</body>

</html>

不确定这是有意还是拼写错误,但您向第一个 setTimeout 传递了两个以上的参数。为了清楚起见,我已经解构了您的代码。这就是你正在做的事情:


function hello () {
  alert("Hello");
}

function hello123 () {
  alert("Hello 123");
}

function hello567 () {
  alert("Hello 567");
}

setTimeout(hello, 0, setTimeout(hello123, 0), setTimeout(hello567, 0));

您将 4 个参数传递给外部 setTimeout 调用。在传递给 (outer/first) setTimeout.

之前,首先评估最后两个以解析它们的值

setTimeout returns一个ID,所以如果内部分别调用return555555和999999,这相当于:

setTimeout(hello, 0, 555555, 999999)

并且由于内部调用首先被评估,如果它们都具有相同的延迟,您会首先看到这些警报1

如果您增加内部超时的延迟,您会在之后看到它们的警报,因为外部超时先过期。


1.由于在 javascript 事件循环中处理超时的方式,可能 它们可能以不同的顺序出现。为了讨论的目的,我忽略了这些特质。