什么是event-loop
- js是单线程,异步需要基于回调来实现
- event-loop就是异步回调的实现原理
例如setTimeout
console.log(1);
setTimeout(function cb1() {
console.log(2);
}, 0);
console.log(3)
1
3
2
js代码是如何执行的
- 从前往后,一行行放在
call stack
里执行
如果一行报错,下面的代码停止执行 - 先执行完所有同步代码,再执行异步代码
遇到异步先放入异步队列,等待时机 - 同步代码一旦执行完
call-stack
为空,就触发event-loop事件循环机制- event-loop不断循环,去回调函数队列中判断是否存在回调函数
- 例如
web-api
中的定时器到时间后,就将回调函数推入这个队列中 - event-loop判断存在函数就出队执行这个函数
- 函数体中的内容被放入
call-stack
中执行 - 重复以上步骤
DOM事件和Event-loop
<body>
<button onclick="fn()">提交</button>
</body>
<script>
console.log(1);
function fn() {
console.log(2);
}
console.log(3);
</script>
例如以上DOM点击事件
本质上也是基于event-loop的回调,只是触发的时机不一样
定时器是通过时间触发,DOM是通过用户点击触发