JS执行机制

1.JS 是单线程 也就是说 同一时间 只能做一件事 

 JavaScript 就是为了处理页面中用户的交互,以及操作 DOM 而诞生,比如某个 DOM 元素进行添加和删除,不能同时进行,应该先添加,后删除

2.单线程就意味着,所有任务需要排队,前一个任务结束 ,才能执行后一个任务。

 这样导致的问题是:如果 JS执行的时间过长,这样就会造成页面渲染不连贯,导致页面渲染加载阻塞的问题

3.同步 和 异步

 为解决 单线程 问题,利用多核 CPU 的计算能力,HTML5 提出Web Worker ,允许 JavaScript 脚本创建多个线程。于是,JS中出现了同步异步

 同步:前一个任务结束后再执行后一个任务,程序的执行顺序与任务的排列顺序是一致的、同步的。

  比如先烧水,等水开了(十分钟之后),再去切菜,炒菜

 异步:做前一个任务时间比较长,那么在做前一个任务的同时,还可以去处理后面其他的任务。

  比如在烧水的同时(利用这十分钟),还可以去切菜,炒菜

 他们的本质区别:这条流水线上各个流程的执行顺序不同。

4.同步任务和异步任务的执行过程

 同步任务:都在主线程上执行,形成一个执行线。

 异步任务:JS 的异步是通过回调函数实现的

 异步任务有三种类型:

  1.普通事件, click、resize 等

  2.资源加载, load、error 等

  3.定时器,setInterval、setTimeout 等

 注意:异步任务相关 回调函数 添加到 任务对列 中(任务队列也称为 消息队列 )

 案例:执行顺序  123

 console.log(1);  

 setInterval(function(){

  console.log(3);

 },1000);

 console.log(2);

 

 

 1.先执行 执行栈中的同步任务

 2.异步任务(回调函数)放入任务队列中

 3.一旦执行栈中的所有同步任务执行完毕,系统就会按次序读取 任务队列 中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈,开始执行、

  总一句话:先执行 同步任务,再执行 异步任务

      

  

 1.先执行 主线程 ,当有异步任务时,提交给 对应的 异步进程处理(处理后)进入异步对列,(如果不处理,则不会进入异步队列)

 2.等全部 主线程 的 任务执行完毕后,查询 异步队列 是否有任务,有则推入主线程处理(重复执行)

 3.由于 主线程 不断的重复获得任务,执行任务,再获取任务,再执行,所以这种机制被称为 事件循环(eventloop)

原文地址:https://www.cnblogs.com/qtbb/p/11693628.html