回调函数是每个前端程序员都应该知道的概念之一。回调可用于数组、计时器函数、promise、事件处理中。
本文将会解释回调函数的概念,同时帮你区分两种回调:同步和异步。
回调函数
首先写一个向人打招呼的函数。
只需要创建一个接受 name 参数的函数 greet(name)。这个函数应返回打招呼的消息:
function greet(name) {
return `Hello, ${name}!`;
}
greet('Cristina'); // => 'Hello, Cristina!'
如果向很多人打招呼该怎么办?可以用特殊的数组方法 array.map() 可以实现:
const persons = [‘Cristina’, ‘Ana’];
const messages = persons.map(greet);
messages; // => [‘Hello, Cristina!’, ‘Hello, Ana!’]
persons.map(greet) 获取 persons 数组的所有元素,并分别用每个元素作为调用参数来调用 greet() 函数:greet(‘Cristina’), greet(‘Ana’)。
有意思的是 persons.map(greet) 方法可以接受 greet() 函数作为参数。这样 greet() 就成了回调函数。
persons.map(greet) 是用另一个函数作为参数的函数,因此被称为高阶函数。
回调函数作为高阶函数的参数,高阶函数通过调用回调函数来执行操作。
重要的是高阶函数负责调用回调,并为其提供正确的参数。
在前面的例子中,高阶函数 persons.map(greet) 负责调用 greet() 函数,并分别把数组中所有的元素 ‘Cristina’ 和 Ana ’ 作为参数。
这就为识别回调提供了一条简单的规则。如果你定义了一个函数,并将其作参数提供给另一个函数的话,那么这就创建了一个回调。
你可以自己编写使用回调的高阶函数。下面是 array.map() 方法的等效版本: