# LAGOU **Repository Path**: xhg91/lagou ## Basic Information - **Project Name**: LAGOU - **Description**: 学习笔记以及作业 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-11-10 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## Event Loop + 负责监听调用栈Call stack和消息队列Queue + Queue发生变化以后,EventLoop便会监听到,然后将任务放入调用栈 在谈JS异步编程的EventLoop之前,我们先得明确什么是同步编程,什么是异步编程,这两者之间又有什么区别? ### 同步与异步 + **同步** : 指的是我们的代码依次执行,也就是当前代码执行结束后,后续代码才会执行,程序的执行顺序跟我们代码的书写顺序是一致的 ```javascript // 同步执行 console.log(1) function fn1 (){ console.log(2) } function fn2 (){ console.log(3) fn1() } fn2() console.log(4) /* 打印结果为 1 3 2 4 */ ``` 上述代码的执行顺序为: 1. 调用栈执行console.log(1),执行完成打印log,调用栈释放该任务 2. 经过函数声明fn1 , fn2 ;由于此时函数没有被调用,因此不会产生执行任务 3. 调用函数fn2,将fn2放进调用栈并执行该任务,打印log(3) 4. 接着调用函数fn1,将fn1放进调用栈并执行,打印log(2),任务完成后,调用栈释放该任务 5. fn2执行完成,调用栈释放该任务 6. 执行console.log(4) + **异步** : 异步任务被启用后,不管当前任务是否完成,都会立即往后执行下一个任务,当异步任务完成后,工作线程会将消息放到消息队列,主线程通过事件循环从消息队列中取出消息,并执行回调函数. *异步就是从主线程发射一个子线程来完成任务*。 + **同步和异步的区别** : 同步可以保证顺序的一致,但是容易造成阻塞;异步可以解决阻塞问题,但是会改变代码的顺序性 > 举个例子: > > > 在公路上,汽车一辆接一辆,有条不紊的运行。这时,有一辆车坏掉了。假如它停在原地进行修理,那么后面的车就会被堵住没法行驶,交通就乱套了。幸好旁边有应急车道,可以把故障车辆推到应急车道修理,而正常的车流不会受到任何影响。等车修好了,再从应急车道回到正常车道即可。唯一的影响就是,应急车道用多了,原来的车辆之间的顺序会有点乱。 ### 消息队列(Queue)和事件循环(EventLoop) + **消息队列** : 消息队列里面存放各种异步任务执行完成后返回的消息,是一个先进先出的队列 + **事件循环** : 事件循环是指主线程重复的从消息队列中取消息,执行的过程. 主线程只会做一件事情,就是从消息队列中取消息,执行消息,再取消息,再执行;当消息队列为空时,就会等待监听消息队列变成非空;而且主线程只会在当前消息执行完成后,才会去取下一个消息,所以消息队列是一个先进先出的队列; 这种机制就叫做事件循环机制,取一个消息并执行的过程叫做一次事件循环.