javascript - 是什么决定了 Javascript 中被读取的行的顺序?
问题描述
这个例子是在演示中给出的,期望 1、2、3 作为这些函数的运行顺序,但实际上它是 1、3、2。好奇为什么 setTimeout 函数会最后运行?
console.log(1)
setTimeout(() => console.log(2), 0)
console.log(3)
解决方案
异步回调,就像传递给setTimeout()
上面的回调一样,被放入队列中,以便在脚本的主要同步主体运行完成时调用。
所以顺序是:
console.log(1)
setTimeout() // but not the callback
// put callback in queue
console.log(2)
// take item from queue and run
() => console.log(2)
这样做的一个结果是传递给的时间是回调触发之前的setTimeout
最短时间。如果主要同步任务花费的时间比这更长,回调将延迟触发。
您可以通过运行长时间运行的while
循环来证明这一点。(但请不要在实际代码中这样做)
let start = Date.now()
let now = start
let then = now + 3000;
// set timer for 100ms
setTimeout(() => console.log("timeout fired ater", Date.now() - start, "milliseconds"), 100)
// slow while loop takes 3000ms
while (now < then){
now = Date.now()
}
console.log("loop done")
推荐阅读
- c# - 将 postgresql 与 Entity Framework Core 一起使用时不支持关键字
- mongodb - 解决ubuntu上mongodb安装错误
- java - org.openqa.selenium 包不可访问
- javascript - 从目录读取文件并保存到对象数组
- json - 试图在颤振中获取json数据
- functional-programming - 使用功能语言编写的系统编程项目(操作系统、数据库、文件系统、游戏、服务器)的示例?
- ruby - 自制正式测试
- java - JPA @ManyToOne 加入复合主键的一部分
- visual-studio-code - 如何设置 Windows 10 + VSCode + pymakr 用于 Python 编程 + Micropython + ESP-IDF 用于 esp32?
- python - 使用 boto3 删除所有 CloudWatch 规则