JavaScript的同步和异步

162 阅读1分钟

1 JS是单线程

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

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

2 同步和异步

同步

前一个任务结束后在执行下一个任务,程序的执行顺序和任务的排列顺序是一致的。

同步任务

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

异步

你在做一件事情时,因为这件事情会花费很长时间,在做这件事的同时,你还可以去处理其他事情。

异步任务

JS的异步是通过回调函数实现的,有以下三种类型

普通事件,如click,resize等

资源加载,如load,error等

定时器,包括setInterval,setTimeout等

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

3 JS 执行机制

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

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

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

事件循环

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