JavaScript是一门单线程的非阻塞的脚本语言
javaScript最初是运行在浏览器端的脚本语言,解决的问题相对简单。目的是实现页面的动态交互,实现页面动态交互的核心就是DOM操作。所以采用单线程模式,避免多线程同步问题。
同步模式与异步模式
JavaScript运行代码时会存在两种模式:同步模式与异步模式。存在异步模式的原因也很简单。因为同步模式下执行一段代码,代码
中任务依次执行,前一个任务结束后才会进行下一个任务。当执行某些耗时任务时就会造成堵塞。所以异步模式就把这些耗时的任务单体提出来另外执行,等到同步代码执行完后再去返回执行好的异步任务的结果。
event loop(事件循环)
evnet loop的作用就是解决js单线程运行时不会阻塞的一种机制。
先看下面这个流程图
event loop流程图
- call stack是调用栈,js代码会放在这里执行
- event loop是事件循环,它负责的就是不断检查调用栈中是否还有任务,如果没有就将右侧消息队列中的任务放入调用栈。
下面来分析这个流程图:
- 执行代码,将任务放入调用栈,判断是同步任务还是异步任务。如果是同步任务就执行该任务。异步任务则会被放入异步队列中执行,拿到结果的异步任务被放入消息队列中等待。
- 当c调用栈中同步任务执行完后,就从消息队列中依次异步任务压入调用栈。Event Loop去不停检查调用栈中是否还有任务,如果没有就去看消息队列中有没有任务,如果有就放入调用栈,如此反复,直到完成所有任务。
宏任务与微任务
- 宏任务有整体代码,setTimeout,I/O,setInterval等
-
微任务有process.nextTick(Node),Promise
宏任务,微任务流程图
这里不同类型的任务会进入不同的事件队列。事件循环顺序是先去执行宏任务,执行宏任务时检查有无微任务,有微任务就放入末尾,等当前宏任务执行完后依次执行微任务。待这个宏任务中的微任务执行完后再执行下一个宏任务。
这里打个比方,在银行排队办业务的人,他所要办的主要的事比如取钱,这是一个宏任务,当他取完钱以后他想查询一下余额,这个可以看成微任务。这时,他不需要再去排队,直接查询余额。等他办完事走了下个人继续办理业务。
网友评论