这里只介绍浏览器中的事件循环,node 中的事件循环放在 node.js 专题部分
github 获取更多前端资源
https://github.com/ChenMingK/WebKnowledges-Notes
灵魂三问
JavaScript 为什么是单线程的?JavaScript 为什么需要异步?JavaScript 单线程又是如何实现异步的?
1.JavaScript 为什么是单线程的?
现在有 2 个线程 process1 process2,假设 JavaScript 是多线程的,所以他们可以对同一个 dom 同时进行操作。process1 删除了该 dom,而 process2 编辑了该 dom,同时下达 2 个矛盾的命令,浏览器究竟该如何执行呢?这样想,JavaScript 为什么被设计成单线程应该就容易理解了吧。
2.JavaScript 为什么需要异步?
如果 JavaScript 中不存在异步,只能自上而下执行,如果上一行解析时间很长,那么下面的代码就会被阻塞。对于用户而言,阻塞就意味着"卡死",这样就导致了很差的用户体验,所以 JavaScript 中存在异步执行。
3.JavaScript 单线程又是如何实现异步的呢?
是通过事件循环来实现的
为了利用多核 CPU 的计算能力,HTML5 提出 Web Worker 标准,允许 JavaScript 脚本创建多个线程,但是子线程完全受主线程控制,且不得操作 DOM。所以,这个新标准并没有改变 JavaScript 单线程的本质。
为什么说 JavaScript 是“非阻塞”的语言?非阻塞即:“程序不会因为某个任务而停下来”
console.log("程序时间:" + new Date().getTime())
setTimeout(function () {
console.log("暂停一秒:" + new Date().getTime())
}, 1000)
console.log('这是暂停一秒之后的时间:' + new Date().getTime())
简单来,如果上图的 setTimeout 换成 C++ 的 sleep(1000) 之类的,那么 C++ 是会确实地“睡眠”那么段时间的,而 JS 不会。如果我就是想实现这个功能呢?可以利用 Promise 实现:

本文介绍了JavaScript为何是单线程以及为何需要异步,并详细阐述了事件循环的工作原理,包括任务队列、宏任务和微任务的区别,以及浏览器中的事件循环过程。最后,通过例题加深理解。
最低0.47元/天 解锁文章
1383

被折叠的 条评论
为什么被折叠?



