这篇文章是我看了多篇博客后自己的归纳总结:给有需要的朋友一些帮助:
什么是同步,什么是异步简单表达就是
同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;
异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。
当然这篇文章主要是讲异步的详情
首先要了解一个知识点(js还存在其他的线程):个人觉得很重要
单线程,是指在JS引擎中负责解释和执行JavaScript代码的线程只有一个,一般称它为主线程。
但是实际上还存在其他的线程,例如:处理AJAX请求的线程、处理DOM事件的线程、定时器线程、读写文件的线程等等。这些线程可能存在于JS引擎之内,也可能存在于JS引擎之外,在此我们不做区分,不妨称它们为工作线程吧。
但是工作线程完全受主线程控制,且不得操作DOM,并没有改变JavaScript单线程的本质。
异步执行步骤
所有同步任务都在主线程上执行,形成一个执行栈(execution context stack),主线程之外,还存在一个"任务队列"(task queue)。
"任务队列"是一个先进先出的数据结构,排在前面的事件,优先返回主线程。这就是为什么点击事件总是最先触发,因为点击事件触发的时候,回调函数会立即添加到任务队列中。而ajax是在网络请求完成返回之后,才将回调添加到任务队列中。
只要异步任务有了运行结果 ,就在任务队列中放置一个事件;而同步任务继续执行下去,当所有的同步任务执行好后:
就会读取任务队列,查看任务队列中哪些任务好了,之后调用回调函数,会不断重复异步执行步骤,这就是事件循环,取一个消息并执行的过程叫做一次循环。
从异步过程的角度看,addEventListener函数就是异步过程的发起函数,事件监听器函数就是异步过程的回调函数。事件触发时,表示异步任务完成,会将事件监听器函数封装成一条消息放到消息队列中,等待主线程执行。