高阶函数无非是那些将函数作为参数或返回值的函数。将函数作为参数一种特别强大、富有表现力的惯用法,也在JavaScript程序中被大量使用。
考虑数组的标准sort方法,为了对所有的数组都能工作,sort方法需要调用者决定如何比较数组中的任意两个元素。
function compareNumbers(x,y){
if(x<y){
return -1;
}
if(x>y){
return 1;
}
return 0;
}
[3,1,4,1,5,9].sort(compareNumbers);//[1,1,3,4,5,9]
标准库需要调用者传递一个具有compare方法的对象,但是由于只有一个方法是必须的,所以直接传递一个函数更为简洁。事实上,上面的例子可以简化如下:
[3,1,4,1,5,9].sort(function(x,y){
if(x<y){
return -1;
}
if(x>y){
return 1;
}
return 0;
});//[1,1,3,4,5,9]
许多关于数组的常见操作包含值得我们熟悉掌握的亲切的高阶函数抽象。
var names=["Fred","Wilma","Pebbles"];
var upper=[];
for(var i =0;n<names.length;i<n;i++){
upper[i]=names[i].toUpperCase();
}
upper;//["FRED","WILMA","Pebbles"];
使用数组便利的map方法,我们可以完全消除循环,仅仅使用一个局部函数就可以实现对元素的逐个转换。
var names=["Fred","Wilma","Pebbles"];
var upper=names.map(function(name){
return name.toUpperCase();
});
upper;//["FRED","WILMA","Pebbles"];