同步与异步
如果你经常使用过js做开发的话,那么你也一定知道,js是一门单线程语言,代码执行有同步与异步之分。
# 为什么会有同步和异步
因为JavaScript的单线程,因此同个时间只能处理单个任务,所有任务都需要排队,前一个任务执行完,才能继续执行下一个任务,但是,如果前一个任务的执行时间很长,比如文件的读取操作或ajax操作,后一个任务就不得不等待,拿ajax来说,当用户向后台获取大量的数据时,不得不等到所有数据都获取完毕才能进行下一步操作,用户只能在那里干等着,严重影响用户体验。
所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征。
所以,为了避免复杂性,JavaScript在设计的时候,就已经考虑到这个问题,主线程可以完全不用等待文件的读取完毕或ajax的加载成功,可以先挂起处于等待中的任务,先运行排在后面的任务,等到文件的读取或ajax有了结果后,再回过头执行挂起的任务,所以JavaScript是单线程,这已经成了这门语言的核心特征。因此任务就可以分为同步任务和异步任务
提示
为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。 其实同步和异步,无论如何,做事情的时候都是只有一条流水线(单线程),同步和异步的差别就在于这条流水线上各个流程的执行顺序不同。
最基础的异步是setTimeout和setInterval函数;
# 同步任务
同步任务是指在主线程上排队执行的任务,只有前一个任务执行完毕,才能继续执行下一个任务。
function foo () {
console.log('2')
};
console.log('1');
foo();
console.log('3');
// 输出
// 1
// 2
// 3
2
3
4
5
6
7
8
9
10
11
以上代码你肯定很熟悉,代码结果会有顺序的输出 1,2,3
# 异步任务
异步任务是指不进入主线程,而进入任务队列的任务,只有任务队列通知主线程,某个异步任务可以执行了,该任务才会进入主线程;
function foo () {
console.log('2')
};
console.log('1');
setTimeout(() => {
foo();
})
console.log('3');
// 输出
// 1
// 3
// 2
2
3
4
5
6
7
8
9
10
11
12
13
14
以上代码的结果会输出:1, 3, 2。因为foo函数的调用在定时器里面,而定时器是最常见的异步任务;
# 参考资料
https://www.cnblogs.com/Yellow-ice/p/10433423.html
https://segmentfault.com/a/1190000015165424