javascript - Chrome 中的回调执行时间与预期不符

标签 javascript web-applications frontend

This blog post解释 JavaScript 执行的幕后工作原理。它描述了堆栈、事件循环、回调队列和 Web API 上下文。

我尝试了以下示例:

function main() {
  setTimeout( () => alert('World') , 1000 ); // don't dismiss this alert for about 5 seconds
  setTimeout( () => alert('Mars') , 5000 );
}

main();

我希望两个计时器并行运行。一旦我消除第一个警报,下一个警报就会立即出现。这是 Firefox 和 Edge 中的行为。但在 Chrome 中,第二个警报在第一个警报消除后 5 秒出现。没有预料到。

这是 Chrome 实现的问题吗? Chrome 是否正在尝试进行一些优化?

版本:Firefox Quantum 61.0.1、Chrome 69.0.3497.100、Edge 42.17134.1.0

最佳答案

JS 的特性之一是执行环境不同,您似乎对可用的不同引擎很了解。

在 Chrome 中,alert 是一种阻塞方法,它将停止执行。

考虑这个例子:

(() => {
  for (let i = 0; i < 10; i++) {
    setTimeout(() => console.log(i), i*1000)
  }
  setTimeout(() => alert('World'), 1000)
  setTimeout(() => alert('Mars'), 5000)
})()

您将看到计数器停止并在警报解除后恢复。但是,您的期望是正确的,JS 通常被认为是非阻塞的,并且通常情况下,诸如 setTimeout 之类的方法会异步运行(例如在for 循环,其中必须递增计时器才能实现所需的行为)。

关于javascript - Chrome 中的回调执行时间与预期不符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52547919/

相关文章:

javascript - 如何使用非对称加密在javascript中接收数据?

javascript - Android 股票浏览器中没有 XMLHttpRequest 2 进展

javascript - 如何添加多于document.getElementById?

java - 我应该如何开始基于 Java 的 Web 开发?

java - JDK 7u10 和 BlackBerry WebWorks SDK 安装问题

Javascript 输入字段应在键入时附加到 div 中

javascript - 未捕获的类型错误 : Cannot read property 'quest' of undefined

javascript - jQuery - 选择 <tr> 的第一个 <td> 中的第一个 <a>

javascript - 从匹配最小值的 json 数组返回单个 json 对象

security - 如何演示CSRF攻击