同步异步
javascript 是一门单线程语言,因此,在同一时间只能做一件事情。
单线程意味着,如果在同个时间有多个任务,这些任务就需要进行排队,前一个任务执行完,才会之下下一个任务。
为什么是单线程?
同它的用途有关,javascript最为浏览器脚本语言,主要用来实现与用户交互,利用javascript,可以实现对DOM各种操作。如果javascript为多线程的话,一个线程在一个DOM节点中增加内容,另一个线程要删除这个DOM节点,那么这个DOM节点究竟是要增加内容还是删除呢?这会带来很复杂的同步问题,所以,它是单线程的。
同步任务
指在主线程上排队执行的任务,只有前一个任务执行完毕,才能继续执行下一个任务。当打开网站时,如元素的渲染。
异步任务
指不进入主线程,而进入任务队列的任务,只有任务队列通知主线程,某个异步任务可以实现了,该任务才会进入主线程。当打开网站时,如图片、音乐加载。
异步机制,说明异步是如何实现——回调和事件循环
异步任务是不会进入主线程,而是会先进入任务队列。任务队列其实是一个先进先出的数据结构,也是一个事件队列,比如说文件读取操作,因为是一个异步任务,因此该任务会被添加到队列中。等待IO完成后,就会在任务队列中添加一个事件,表示异步任务完成可以进入执行栈。
但这个时候,主线程不一定有空,当主线程处理完其他任务有空时,就会读取任务队列,读取里面有哪些事件,排在前面的事件会被优先进行处理,如果该任务指定了回调函数,那么主线程在处理该事件时,就会执行回调函数中的代码,也就是执行异步任务了。
单线程从任务队列中读取任务是不断循环的,每次栈被清空后,都会在任务队列中读取新任务。如果没有任务,就会等待,直到有新的任务,因为某个任务都是由一个事件触发,故也称事件循环。
异步机制可以包括以下几个步骤:
1、所有同步任务都在主线程上执行,形成一个执行栈。
2、主线程之外,还存在一个任务队列,只要异步任务有了结果,就会在任务队列中放置一个事件。
3、一旦执行栈中的所有同步任务执行完毕,系统就会读取任务队列,看看里面还有哪些事情,
那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
4、主线程不断地重复上面的第三步。