(一) 什么是回调函数
如果你定义了一个函数,并将其作为参数提供给了另外一个函数的话,那么这就创建了一个回调,这个定义的函数就被称为回调函数,而接受该函数作为参数的函数,我们称之为高阶函数。这句话是不是有些拗口,难以理解,没关系,接下来举例如你理解明白。
首先,我们创建一个吃东西的函数。
只需要创建一个接受something参数的函数eat(something).。这个函数应返回吃东西的信息:
function eat(somethint) {
return `I like eat ${something}!`;
}
eat('Hamburg'); // => 'I like eat Hamburg!'
如果我喜欢吃很多东西怎么办?可以用map()函数实现:
var foods = ['Hamburg', 'Ice cream'];
var msg = foods.map(eat);
msg; // => ['I like eat Hamburg!', 'I like eat Ice cream!']
foods.map(eat)获取foods数组中的所有元素,并且分别取出数组中的每个元素去调用eat()函数: eat(Hamburg)、eat(Ice cream)
。
foods.map(eat)方法可以接受eat()函数作为参数。这样eat()就变成了回调函数 。
foods.map(eat)是用另一个函数作为参数的函数,因此被称为高级函数。
当然,我们自己也可编写并使用回调的高阶函数。下面举一个array.map()函数的等效实现方式:
function eat(somethint) {
return `I like eat ${something}!`;
}
function map(array, callback) {
var foodsArray = [];
for(let item of array) {
foodsArray .push(callback(item));
}
return foodsArray;
}
var foods = ['Hamburg', 'Ice cream'];
var msg = map(foods, eat);
msg; // => ['I like eat Hamburg!', 'I like eat Ice cream!']
这里我们自定义的map(array, callback)就是一个高阶函数,因为它用回调函数eat()作为参数,然后在其主题内部调用了该回调函数:callback(item)。
补充:
上述map()高阶函数里面的for()循环,为啥写成了for(let item of array)
的形式,而不是传统的for(var i = 0; i < array.length; i++)
样子,一方面是为了*B,另一方面能够减少代码的写入量,程序猿应该都喜欢与众不同一点吧。
for(let item in array)与for(let item of array)的简单比较以及使用:
// 在控制台调试
var array = ['Hamburg', 'Ice cream'];
// 输出的是下表
for(let item in array) {
console.log(item);
}
// 输出结果:0 1
// 输出的是数组元素
for(let item of array) {
console.log(item);
}
// 输出结果:Hamburg Ice cream