这两天复习了一下数组的map、filter等方法,后面又重新了解了一下高阶函数、函数柯里化,这里简单记录一下
高阶函数在我看来就是一个函数可以接受另一个函数作为参数,又把函数作为返回值输出,这样的函数就是高阶函数,就是用一个函数来控制函数。
举个例子:定义一个函数fnsum求两个数的和
function fnsum(a,b){
return a,b;
}
但是我像求这两个数绝对值的和,我可以直接在函数fnsum的里面处理,还有一种方法就是利用到高阶函数了
function fnsum(a,b,fn){
return fn(a)+fn(b);
}
fnsum(3,-3,Math.abs) //结果为6
还有就是map函数,它也是高阶函数,作用是遍历数组,并且返回一个新的数组,新的数组里的每一个元素都执行map传入的函数
arr = [1,2,3].map(fn)
console.log(arr2)
function fn(x){
retrun x*x
}
这里返回了一个新数组arr,原数组没有变动,所以使用map高阶函数不会对原来的数组造成影响。
函数柯里化
第一次看到柯里化这个词的时候,觉得它很高端,但实际了解以后才发现其实就是高阶函数的一个特殊用法。
按我的理解其实就是本来函数要传多个参数,现在只传递给函数一部分参数来调用它,让他返回一个函数来处理剩余的参数,但我想了很长时间没搞懂,为什么费了这么大劲封装一层,有什么用呢?
所以更深入的了解了下柯里化
function add(a,b,c,d){
return a+b+c+d;
}
console.log(add.length)
//固定参数的柯里化
function fixedparamscurry(fn){
// 可能传递的参数要收集
// arguments
var _arg = [].slice.call(arguments , 1);
return function(){
// _arg = [10,20]
var newArg = _arg.concat( Array.prototype.slice.call(arguments , 0) );
return fn.apply(this , newArg)
}
}
// var newAdd = fixedparamscurry(add,10,20);
// // 期待...
// console.log( newAdd(30,40) )
function curry(fn,length){
var length = length || fn.length; //直接就可以判断出函数有几个形参
return function(){
if(arguments.length < length){ //参数没有传递完成
var arr = [fn].concat( Array.prototype.slice.call(arguments , 0) )
return curry( fixedparamscurry.apply(this,arr) , length - arguments.length )
}else{ //传递完成了以后
return fn.apply(this , arguments)
}
}
}
var newAdd = curry(add);
console.log(newAdd(10)()()()(20)(30)()()(74))