这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情
进程:进程其实就是一个程序(简单可以理解为,浏览器打开一个页面就是开辟一个进程) 线程:线程是进程中去执行相关任务的 同步编程:只能一件事情一件事情的处理,上一件事情完成才能处理下一件事情。[一般是单线程] 异步编程:同时处理多件事情。[一般是因为多线程]
浏览器是多线程的,可以同时处理很多事情:
- GUI渲染线程
- JS引擎线程[JS引擎线程会把栈内存中的代码逐行解析执行]
- 监听事件触发线程
- 定时触发器线程
- 异步HTTP请求线程
- WebWorker
- ... 浏览器利用多线程,完全可以同时处理很多事情,实现异步编程~
JS代码的执行是单线程的:因为浏览器只分配一个线程JS引擎线程(主线程)用来渲染和解析JS
- JS中大部分代码都是同步的:如果此时主线程正在执行某些代码,那么其余的事情都做不了(例如:循环就是同步代码,如果JS出现死循环,那么主线程永远空闲不下来,其他的事情都处理不了,整个页面就会卡住)
- JS中也有一部分代码是异步的:并不是像想象中的同时执行很多代码,而是
基于EventLoop&浏览器的多线程机制实现监听、排队的机制异步微任务:优先级高 - requestAnimationFrame 实现JS动画
- Promise.then | resolve/reject
- await
- queueMicrotask 创建一个新的异步微任务
- IntersectionObserver 监听DOM元素和视口交叉的信息
- MutationObserver 监听DOM元素属性改变
- process.nextTick
- ...
异步宏任务:优先级低 - setTimeout/setInterval
- 事件绑定
- ajax/fetch异步数据请求
- MessageChannel
- setImmediate
- ...