改变你对事件循环错误的认知!
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
浏览器的进程模型何为进程?
何为线程?
浏览器有哪些进程和线程?浏览器是一个多进程多线程的应用程序 浏览器右上角三个点那里的 每打开一个标签页就会开启一个渲染线程,尝试多打开一个标签页,任务管理器会多一个线程。
渲染主线程是如何工作的?渲染主线程是浏览器中最繁忙的的线程,需要它处理的任务包括但不限于:
为何只能有一个渲染主线程?比如正在执行一个js函数去修改页面,定时器的任务也到达了时间,那么应该执行哪个?同时执行的话,修改了同一个地方如何选择。 一个渲染进程只能有一个渲染主进程,使用消息队列来调度任务
若干解释何为异步?代码执行过程中,会遇到一些无法立即执行的任务,比如:
面试题:如何理解 JS 的异步?Js 是一门单线程的语言,这是因为它运行在浏览器的渲染主线程中,而渲染主线程只有一个。 js 为何会阻碍渲染?渲染主线程只有一个,js 的执行与渲染都在主线程中,两者无法同时执行。react 的fiber 就是为了解决此问题 任务有优先级吗?任务没有优先级,消息队列有优先级,消息队列会有多种,随着浏览器的复杂度急剧提升,W3C 将不再使用宏队列的说法 根据 W3C 的最新解释:
在目前 chrome 的实现中,至少包含了下面队列, 微队列 > 交互队列 > 延时队列
几道题加深理解setTimeout(()=>{ console.log(1) // 交给计时线程,等待添加到延时队列 },0) console.log(2) // 执行完后执行延时队列中的任务 结果:输入 2,1 function delay(duration){ var start = Date.now(); while (Date.now() - start < duration){} } setTimeout(()=>{ console.log(1) // 交给计时线程,等待添加到延时队列 },0) delay(1000) // 阻塞主线程一秒
console.log(2) // 输出 2,由于阻塞一秒后,计时线程已经把任务计时完成加到延时队列了,所以输出 2 后立即输出 1 结果:等待一秒后,同时输出 2,1 setTimeout(()=>{ console.log(1) // 交给计时线程,等待添加到延时队列 },0) Promise.resolve().then(()=>{ console.log(2) // 立即添加到微队列,微队列优先级高于延时队列 }) console.log(3) // 全局任务 结果:输出 3,2,1 // 只是定义,还未执行哈 function a(){ console.log(1) Promise.resolve().then(()=>{ console.log(2) }) } setTimeout(()=>{ console.log(3) Promise.resolve().then(a) },0) Promise.resolve().then(()=>{ console.log(4) // 立即添加到微队列,微队列优先级高于延时队列 }) console.log(5) // 全局 结果:5,4,3,1,2 总结什么是事件循环?
JS 中的计时器能做到精确计时吗?不行,因为
结语:单线程是异步产生的原因,事件循环是异步的实现方式 该文章在 2023/8/28 9:28:08 编辑过 |
关键字查询
相关文章
正在查询... |