大家都知道,JavaScript是一门单线程非阻塞的脚本语言
单线程意味着JavaScript只有一个主线程来处理所有任务,而非阻塞则说明那些耗时的异步任务(如ajax请求、定时器、DOM事件等)不会阻塞javascript的代码执行
那么,单线程的JavaScript是如何去处理这些异步任务?很多人将js的异步处理理解为类似多线程的编程模式,其实这还是有很大差别的,要完全理解javascript的异步,就要了解js的运行核心-事件循环(event loop)
在介绍js的事件循环机制前,先介绍两个名词:
执行栈:js脚本第一次执行的时候,js引擎会解析这段代码,并将其中的代码按照执行顺序加入执行栈中,然后从头开始执行.
事件队列:一个存储着待执行任务(异步任务)的队列,其中任务严格按照先后顺序执
事件循环的原理如下图,js脚本执行一段代码时,会将代码压入执行栈(call stack),并顺序执行,当遇到异步任务,会将任务挂起(pending),继续执行后续代码,这样保证代码不会阻塞,当异步任务执行结束后,浏览器会将回调函数加入事件队列中(callback queue).当执行栈(call stack)为空时,js引擎会不停的检查事件队列,如果事件队列不为空,则取出第一个任务到执行栈中执行,依次循环,直至事件队列为空
有条件的童鞋可以科学上网,看一下youtube大神的视频讲解,非常精彩https://www.youtube.com/watch?v=8aGhZQkoFbQ
参考文章:
https://www.cnblogs.com/dong-xu/p/7000163.html
https://www.cnblogs.com/cangqinglang/p/8967268.html