JavaScript单线程

 

    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高级程序设计>>

宝剑锋从磨砺出,梅花香自苦寒来。
原文地址:https://www.cnblogs.com/haimengqingyuan/p/7216448.html