019 JS同步与异步

94 阅读2分钟

JS同步与异步

Javascript 语言的一大特点就是单线程,也就是说,同一时间只能做一件事。

(这是因为JavaScript这门脚本语言诞生的使命所致--JavaScript是为处理页面中用户的交互,以及操作DOM而诞生的。比如我们对某个DOM元素进行添加和删除操作,不能同时进行。)

单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。这样所导致的问题就是:如果JS执行的时间过长,就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。

异步模式非常重要。在浏览器端,耗时很长的操作都应该异步执行,避免浏览器失去响应,最好的例子就是Ajax操作。

为了解决这个问题,JavaScript语言将任务的执行模式分为两种:**同步(Synchronous)**和 异步(Asynchronous)

同步模式就是后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的;

异步模式 则完全不同,每个任务有一个或多个回调函数(callback),前一个任务结束后不是执行队列上的后一个任务,而是执行回调函数;后一个任务则是不等前一个任务的回调函数的执行而执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。

同步任务:

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

异步任务:

js的异步是通过回调函数实现的。

一般而言,异步任务有一下三种类型:

  1. 普通事件,如 click、resize 等
  2. 资源加载,如 load 、error等
  3. 定时器,包括setInterval、setTimeout等

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

JS执行机制

  1. 先执行执行栈中的同步任务
  2. 异步任务(回调函数)放入任务队列中。
  3. 一旦执行栈中的所有同步任务执行完毕,系统就会按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈,开始执行。

事件循环

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

同步与异步.png

js任务执行.png