JavaScript 语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.
单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务.
这样所导致的问题是: 如果 JS 执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉.
同步和异步
利用多核 CPU 的计算能力,HTML5 提出 Web Worker 标准,允许 JavaScript 脚本创建多个线程.
于是,JS 中出现了同步和异步.
同步
前一个任务结束后再执行后一个任务,程序的执行顺序与任务的排列顺序是一致的、同步的。
异步
在做一件事的同时,还可以去处理其他事情.
同步任务
同步任务都在主线程上执行,形成一个执行栈
异步任务
JS 的异步是通过回调函数实现的
一般而言,异步任务有以下三种类型:
- 普通事件,如 click、resize 等
- 资源加载,如 load、error 等
- 定时器,包括 setInterval、setTimeout 等
异步任务相关回调函数添加到任务队列中(任务队列也称为消息队列)
异步JavaScript
https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Asynchronous/Introducing
通用异步编程概念
https://developer.mozilla.org/zh-CN/docs/conflicting/Learn/JavaScript/Asynchronous/Introducing
执行机制
- 先执行
执行栈
中的同步任务 - 异步任务放入任务队列中
- 一旦
执行栈
中的所有同步任务执行完毕,系统就会按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈
,开始执行
主线程不断的重复获得任务、执行任务、再获取任务、再执行,这种机制被称为事件循环Event Loop

发表回复