web前端面试题@十七(js的单线程和多线程)

js单线程重点:

        JS 是单线程的,但是却能执行异步任务,

        这主要是因为 JS 中存在事件循环(Event Loop)和任务队列(Task Queue)。

js的工作机制:

        当线程中没有执行任何同步代码的前提下才会执行异步代码,setTimeout是异步代码,所以setTimeout只能等js空闲才会执行,但死循环是永远不会空闲的,所以setTimeout也永远不会执行。即使setTimeout为0,他也是等js引擎的代码执行完之后才会插入到js引擎线程的最后执行。

单线程:

           在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行,通俗来说单线程,就是所有任务都是一条直线的执行下去,前一个任务结束,才会执行后一个任务。如果前一个任务死循环或者需要好长时间执行,后一个任务就要一直等,直到前一个执行完。

多线程——Web Worker 

        Web Worker是HTML5提出的新标准,为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。在主线程运行的同时,Worker 线程在后台运行,两者互不干扰。等到 Worker 线程完成计算任务,再把结果返回给主线程。这样的好处是,一些计算密集型或高延迟的任务,被 Worker 线程负担了,主线程(通常负责 UI 交互)就会很流畅,不会被阻塞或拖慢。

        其实JS为我们提供了一个Worker的类,它的作用就是为了解决这种阻塞的现象。当我们使用这个类的时候,它就会向浏览器申请一个新的线程。这个线程就用来单独执行一个js文件。

var worker = new Worker(js文件路径);

你可能感兴趣的:(web前端面试题@十七(js的单线程和多线程))