javascript是单线程的理解

本文深入探讨了JavaScript的单线程特性及其原因,解释了同步任务和异步任务的区别,以及如何通过任务队列来管理这些任务。重点介绍了宏任务和微任务的概念,阐述了它们在事件循环中的执行顺序,特别是await后的阻塞代码会在下一个宏任务之前执行。此外,还提到了回调函数在异步任务中的作用,以及JavaScript引擎如何判断异步任务是否可以进入主线程执行。
摘要由CSDN通过智能技术生成
一、javascript为什么是单线程的

JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如两个线程同时操作一个dom。

任务队列

单线程就意味着所有任务要排队,如果前一个占用时间很长(如ajax请求),其实造成了不必要的资源的浪费。所以聪明的语言设计者想到了这点,便将任务可以分为两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。

同步任务: 是那些没有被引擎挂起、在主线程上排队执行的任务。只有前一个任务执行完毕,才能执行后一个任务。
异步任务: 是那些被引擎放在一边,不进入主线程、而进入任务队列的任务。

首先,主线程会去执行所有的同步任务。等到同步任务全部执行完,就会去看任务队列里面的异步任务。如果满足条件,那么异步任务就重新进入主线程开始执行,这时它就变成同步任务了。等到执行完,下一个异步任务再进入主线程开始执行。一旦任务队列清空,程序就结束执行。

异步任务的写法通常是回调函数。一旦异步任务重新进入主线程,就会执行对应的回调函数。如果一个异步任务没有回调函数,就不会进入任务队列,也就是说,不会重新进入主线程,因为没有用回调函数指定下一步的操作。

JavaScript 引擎怎么知道异步任务有没有结果,能不能进入主线程呢?答案就是引擎在不停地检查,一遍又一遍,只要同步任务执行完了,引擎就会去检查那些挂起来的异步任务,是不是可以进入主线程了。这种循环检查的机制,就叫做事件循环(Event Loop)。

宏任务和微任务

除了广义的同步任务和异步任务,JavaScript 单线程中的任务可以细分为宏任务和微任务。

第一次事件循环中,JavaScript 引擎会把整个 script 代码当成一个宏任务执行,执行完成之后,再检测本次循环中是否寻在微任务,存在的话就依次从微任务的任务队列中读取执行完所有的微任务,再读取宏任务的任务队列中的任务执行,再执行所有的微任务,如此循环。JS 的执行顺序就是每次事件循环中的宏任务-微任务。

补充: await 以后的阻塞代码将放到下一个宏任务之前执行
可参考文章 async/await代码执行顺序分析及宏任务和微任务简介

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值