1.同步行为和异步行为的对立统一是计算机科学的一个基本概念。
2.特别是在 JavaScript 这种单线程事件循环模型中,同步操作与异步操作更是代码所要依赖的核心机制。异步行为是为了优化因计算量大而时间长的操作。
3.如果在等待其他操作完成的同时,即使运行其他指令,系统也能保持稳定,那么这样做就是务实的。
4.重要的是,异步操作并不一定计算量大或要等很长时间。
5.只要你不想为等待某个异步操作而阻塞线程执行,那么任何时候都可以使用。
6.同步行为对应内存中顺序执行的处理器指令。
7.每条指令都会严格按照它们出现的顺序来执行,而每条指令执行后也能立即获得存储在系统本地(如寄存器或系统内存)的信息。
8.这样的执行流程容易分析程序在执行到代码任意位置时的状态(比如变量的值)。
9.同步操作的例子可以是执行一次简单的数学计算
let x = 3;
x = x + 4;
10.在程序执行的每一步,都可以推断出程序的状态。
11.这是因为后面的指令总是在前面的指令完成后才会执行。
12.等到最后一条指定执行完毕,存储在 x 的值就立即可以使用。
13.这两行 JavaScript 代码对应的低级指并不难想象。
14.首先,操作系统会在栈内存上分配一个存储浮点数值的空间,然后针对这个值做一次数学计算,再把计算结果写回之前分配的内存中。
15.所有这些指令都是在单个线程中按顺序执行的。
16.在低级指令的层面,有充足的工具可以确定系统状态。
17.相对地,异步行为类似于系统中断,即当前进程外部的实体可以触发代码执行。
18.异步操作经常是必要的,因为强制进程等待一个长时间的操作通常是不可行的(同步操作则必须要等)。