本文试图尝试站在初学 异步 编程的角度来解释什么是 回调函数。
同步和异步
在介绍 回调函数 之前,先来看两个概念 同步 和 异步。
同步 行为通常指代码从上到下一行一行的顺序执行,后面的代码总是在前面的代码执行完成以后才会执行。
同步 操作的例子如下:let a, b;
function foo() {
a = 1;
}
foo();
b = a + 1;
console.log(b); //2
由于代码顺序执行,先调用函数 foo();,后执行 b = a + 1;,所以在执行 b = a + 1; 时,a 的值一定已经被确定为 1 了,可以立即使用,变量 b 最终结果为 2。
异步 行为则指代码并非按照顺序执行,后面的代码不一定总是在前面的代码执行完成以后才会执行。
异步 操作的例子如下:let a, b;
function foo() {
a = 1;
}
setTimeout(foo, 1000); //1 秒以后再调用 foo()
b = a + 1;
console.log(b); //NaN
这里没有显式的调用 foo(),而是将函数名 foo 传递给 setTimeout,JavaScript 运行时在 1 秒以后会自动调用 foo()。
首先代码依然顺序执行,当执行到 setTimeout(foo, 1000); 时,JavaScript 主线程发现这是一个将要异步执行的任务,