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 事件循环中处理超时的方式,可能 它们可能以不同的顺序出现。为了讨论的目的,我忽略了这些特质。
我试图理解 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 事件循环中处理超时的方式,可能 它们可能以不同的顺序出现。为了讨论的目的,我忽略了这些特质。