JS基础--高阶函数(一)
JS基础–高阶函数(一)
有一种函数,它可以接受另一个函数作为参数,这种函数,我为称之为高阶函数(Higher-order function)。 经常在写的带callback的函数,就是属于高阶函数;如常见的setTimeOut、setInterval、Array.sort等都是高阶函数;
高阶函数是指满足至少下列条件之一的函数。
- 函数可以作为参数被传递;
- 函数可以作为返回值被输出;
使用场景
在很多程序中,有一些基本的算法会被编写多次,但是可能每次稍有不同。这就是发挥使用函数作为参数所长的地方。
可以做的事情是将算法的基本结构编写到一个函数中。然后,对少许部分进行修改,并将其作为函数参数补充回来。这样可以在一个函数中增加很多可定制的因素。
还可以添加其他函数参数为将来进行扩展。这种组合函数可以减少编程的冗余,通过扩展,还可以减少在一个程序中反复编写相同的算法所引起的错误。
如果在代码中出现大量重复或者相似的地方,那么就很有可能可以用高阶函数来代替。
举个例子:
1、程序一:使用英文字母构造一个字符串:
var aIndex = 'a'.charCodeAt(0); //97
var alphabet = "";
for(var i = 0; i < 26; i++){
alphabet += String.fromCharCode(aIndex + i)
}
alphabet; // "abcdefghijklmnopqrstuvwxyz"
2、程序二:生成一个包含数字的字符串:
var digits = "";
for(var i = 0; i < 10; i++){
digits += i;
}
digits; //"0123456789"
3、程序三:再创建一个随机的字符串:
var random = "";
for(var i = 0; i < 8; i++){
random += String.fromCharCode(Math.floor(Math.random()*26) + aIndex);
}
random; //"qejkoitv"
上面三段代码都用共同的逻辑。每个循环都是通过连接每个独立部分的积算结果来创建一个字符串。可以提取出共用的部分,将它们移到单个工具函数里:
function buildString(n, callback){
var result = "";
for(var i = 0; i < n; i++){
result += callback(i);
}
return result;
}
buildString函数的实现包含了每个循环的所有共用部分,并使用参数来替代变化的部分。循环迭代的次数由变量n来替代,每个字符串片段的构造由callback函数替代。那么以上三个例子就可以简化如下:
var alphabet = buildString(26, function(i){
return String.fromCharCode(aIndex + i);
});
var digits = buildString(10, function(i){
return i;
});
var random = buildString(8, function(){
return String.fromCharCode(Math.floor(Math.random() * 26) + aIndex);
});