- 事件循环就是不断的从消息队列中拿任务
- JavaScript 是单线程的语言,这意味着一次只能执行一个任务。
- 最开始的时候、渲染主线程会进入一个无线循环
- 每一次循环会检查消息队列中是否有任务存在,如果有就取出第一个任务执行,执行完成后进入下一次循环,没有则进入休眠状态
- 其他所有线程(包括其他进程的线程)可以随时向消息队列中添加任务,新任务会添加到消息队列的末尾

代码示例
- 渲染主线程通知交互线程监听按钮点击
- 交互线程监听按钮点击,发现点击事件里面有函数需要执行,于是乎,交互线程就会把函数包装成任务放到队列
- 渲染主线程从消息队列中取出任务,设置dom文本,浏览器需要重新渲染,重新绘制,于是乎产生了一个绘制任务,执行绘制任务需要到队列中重新排队
- 渲染主线程继续执行后面代码(死循环3秒)
- 渲染主线程执行完死循环后,再从队列中取出绘制任务,渲染页面
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Delay Example</title>
</head>
<body>
<h1 id="h1">Hello World</h1>
<button id="btn">Click Me</button>
<script>
function delay1(duration, callback) {
setTimeout(callback, duration);
}
function delay2(duration) {
var start = Date.now();
while (Date.now() - start < duration) {}
}
document.getElementById("btn").onclick = function () {
document.getElementById("h1").textContent = "666";
delay2(3000);
};
</script>
</body>
</html>