事件循环
javascript语言的特点就是单线程,也就是在同一时间只能做一件事情,其他线程在事件队列里面等待主线程空闲,然后事件队列按照队列的顺序一次在主线程执行…
单线程
- 因为js是客户端脚本,由于js主要的用途是处理用户的交互,所以如果是多线程,当用户又多个操作的时候,不好进行管理。
- 单线程就意味着,所有的任务都需要排队,前一个任务执行结束,才会执行下一个任务。
同步任务和异步任务
- 同步任务: 在主线程上执行的任务,只有当上一个任务执行完毕,下一个任务才会执行,所以如果一个任务耗时很长,下一个任务就会等待,形成阻塞
- 异步任务:不进入主线程,而进入任务队列的任务,只有任务队列通知主线程,某个异步任务可以执行了,该任务才进入主线程执行
一般来说,有以下四种会放入异步任务队列::
- setTimeout和setlnterval
- Ajax异步请求
- promise
- dom事件
js的执行机制(主线程 + event task事件队列+ event loop事件循环)
上面你说了同步任务和异步任务,事件循环其实就是检测任务执行的一个过程
1.所有的同步任务在主线程上执行,形成一个执行栈
2.在主线程之外,还有一个任务队列,只有当异步任务又了结果,都会在任务队列中放置一个事件
3.一旦执行栈道中所有的同步任务执行完毕,也就是说主线程空闲,系统就会读取执行队列的事件,也就是执行将异步任务的结果放入执行栈
4.主线程不同重复上面的三个步骤