浏览器事件循环介绍

本文介绍了JavaScript为何是单线程以及为何需要异步,并详细阐述了事件循环的工作原理,包括任务队列、宏任务和微任务的区别,以及浏览器中的事件循环过程。最后,通过例题加深理解。
摘要由CSDN通过智能技术生成

这里只介绍浏览器中的事件循环,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 实现:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值