js引擎的执行机制及js异步那些事
链接:http://www.cnblogs.com/c3gen/p/6170504.html
http://blog.csdn.net/memeda_bupt/article/details/50961682
引言:
要理解js引擎的执行机制,首先要从js是单线程的说起,为什么js是单线程,其实也是很好理解的,因为js最开始是作为浏览器脚本语言,作用是为了增加用户与浏览器的交互行为以及操作DOM。js的作用就决定了js必定是单线程的,因为如果js是多线程的(例:假设js有两个线程A和B,A线程指示删除一个DOM节点,B线程指示编辑一个DOM节点,那这个时候浏览器就会接受一个矛盾的命令,浏览器并不知道是执行A线程下达的指示还是执行B线程下达的指示)。
js是单线程的(js引擎中只有一个"主线程"),这好像意味着所有的任务都在这条唯一的主线程里面执行,下一个任务必须等到上一个任务执行完成才能执行(即同步任务),这就会导致一个问题,当上一个任务执行的时间很长的时候,下一个任务就会处于一个等待的状态(在页面上显示的效果就是页面可能会处于假死状态)。
为了更好地处理主线程同步任务的弊端,HTML5提出Web Worker标准,允许JavaScript脚本创建多个子线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。这为js"异步任务"的出现提供了支持。
划重点:
所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。
异步任务(函数)是被压入了一个称之为Event Loop的队列。而通常都是通过回调函数来实现任务异步。
Event Loop是一个回调函数队列,事件循环是一个先进先出(FIFO)队列,这说明回调是按照它们被加入队列的顺序执行的。