进程:指一个程序
线程:程序中具体做事的人
js运行机制:一个人同时只能做一件事情
同步:如果只有一个人这件事做不完,下件事做不了
异步:可以同时做多个事情, 这件事没做完,下一件事其他人可以做
浏览器是多线程的
+ GUI渲染线程,渲染和解析页面
+ JS引擎线程:渲染和解析Js 【浏览器分配一个线程去解析js,所以js是单线程的】
+ 定时器监听线程
+ 事件监听线程
+ HTTP网络请求线程【同源下浏览器最多分配5-7个HTTP线程】
JS是单线程运行,所以大部分代码是同步的(例如:循环…)
+所以不要在代码中写“死循环”,“死递归” …操作 ,这些操作会一直占用
js引擎线程,导致其他代码无法执行
- 但是js单中也有异步操作代码
- 【异步微任务】:
- requestAnimateFrame
- Promise.then/catch/finally
- async/await
- queueMicrotask 手动创建一个异步的微任务
- MuationObserver 监听dom元素属性值改变
- IntersectionObserver
【异步宏任务】 - setTimeout/setInterval
- 事件绑定/队列
- XMLHttpRequset/Fetch
- MessageChannel
JS中的异步线程:是借用浏览器的多线程机制,再基于eventLoop事件循环机制,实现单线程异步效果
console.time('AA')
for(let i=0;i<999999;){}
console.timeEnd('eeeee')
console.log('ok')
setTimeout(()=>{
console.log('1')
},0)也不是立即执行,而是等待5-7ms 是【浏览器】最快的处理时间