JavaScript的单线程源于其需要与用户进行交互,通过响应用户的操作作出相应的反应。如果非单线程,那么当用户执行两个相互矛盾的操作时,都需要得到响应,那么究竟是哪一个先哪一个后呢?因此,为了避免这种矛盾,JavaScript总是单线程执行。
JavaScript任务分为两种:同步任务、异步任务。同步任务位于主线程上,形成一个执行栈,后一个任务的执行需要依赖于前一个任务的执行结束;而以不变任务位于任务队列中,暂时不进入主线程,其需要等待主线程上的任务执行完,且自己需要的资源得到,再利用回调函数执行该任务。即主线程上的任务执行结束之后才会调用任务队列中的任务。其中定时器(setTimeout()和setInterval())也放置在任务队列中,指定相应的回调函数在多少时间之后执行。
eg.
setTimeout(function(){console.log(1);}, 0); console.log(2);
先执行主线程上的任务,即console.log(2);其执行完毕才会执行任务队列中的任务,即第一句的定时器函数。因此会输出2,1。
ps:当定时器指定的时间到了之后,若前面任务还没有执行完,则继续执行前面的任务,等待任务执行完毕之后立即调用定时器函数。若前面任务已经执行完毕,但定时器的时间还没到,则等待时间到了再执行定时器函数,这个空闲时间段可以先去执行别的任务。
学习&感谢:
http://www.ruanyifeng.com/blog/2014/10/event-loop.html
<<JavaScript高级程序设计>>