一字一句的让你彻底掌握JavaScript中的回调函数
摘要:本文将会解释回调函数的概念,同时帮你区分两种回调:同步和异步。
回调函数是每个前端程序员都应该知道的概念之一。回调可用于数组、计时器函数、promise、事件处理中。
本文将会解释回调函数的概念,同时帮你区分两种回调:同步和异步。
回调函数
首先写一个向人打招呼的函数。
只需要创建一个接受 参数的函数 。这个函数应返回打招呼的消息:

如果向很多人打招呼该怎么办?可以用特殊的数组方法 可以实现:

获取 数组的所有元素,并分别用每个元素作为调用参数来调用 函数:, 。
有意思的是 方法可以接受 函数作为参数。这样 就成了回调函数。
是用另一个函数作为参数的函数,因此被称为高阶函数。
回调函数
作为
高阶函数
的参数,高阶函数通过调用回调函数来执行操作。
重要的是高阶函数负责调用回调,并为其提供正确的参数。
在前面的例子中,高阶函数 负责调用 函数,并分别把数组中所有的元素 和 作为参数。
这就为识别回调提供了一条简单的规则。如果你定义了一个函数,并将其作参数提供给另一个函数的话,那么这就创建了一个回调。
你可以自己编写使用回调的高阶函数。下面是 方法的等效版本:

是一个高阶函数,因为它用回调函数作为参数,然后在其主体内部调用该回调函数:。
注意,常规函数(用关键字 定义)或箭头函数(用粗箭头 定义)同样可以作为回调使用。
同步回调
回调的调用方式有两种:同步和异步回调。
同步回调是“阻塞”的:高阶函数直到回调函数完成后才继续执行。
例如,调用 和 函数。

其中 是同步回调。
同步回调的步骤:
同步回调的例子
许多原生 JavaScript 类型的方法都使用同步回调。
最常用的是 array 的方法,例如: , , , ,

字符串类型的 方法也能接受同步执行的回调:

异步回调
异步回调是“非阻塞的”:高阶函数无需等待回调完成即可完成其执行。高阶函数可确保稍后在特定事件上执行回调。
在以下的例子中, 函数的执行延迟了 2 秒:

是一个异步回调,因为 启动并完成了执行,但是 在 2 秒后执行。
异步调用回调的步骤:
异步回调的例子
计时器函数异步调用回调:

DOM 事件侦听器还异步调用事件处理函数(回调函数的子类型):

异步回调函数与异步函数
在函数定义之前加上特殊关键字 会创建一个异步函数:

是异步的,因为它以 为前缀。函数 从 GitHub 上获取前5个用户 。然后从响应对象中提取 JSON 数据:。
异步函数是 promise 之上的语法糖。当遇到表达式 (调用 会返回一个promise)时,异步函数会暂停执行,直到 promise 被解决。
异步回调函数和异步函数是不同的两个术语。
异步回调函数由高阶函数以非阻塞方式执行。但是异步函数在等待 promise()解析时会暂停执行。
但是你可以把异步函数用作异步回调!
让我们把异步函数 设为异步回调,只需单击按钮即可调用:

总结
回调是一个可以作为参数传给另一个函数(高阶函数)执行的函数。
回调函数有两种:同步和异步。
同步回调是阻塞的。
异步回调是非阻塞的。
最后考考你: 执行 时是同步还是异步的?