高阶函数(学习)
满足条件
1.函数作为参数被传递:比如回调函数
2.函数作为返回值输出:让函数返回可执行函数,以为运算过程是可以延续的
柯里化(简单理解)
柯里化定义
柯里化(Currying),部分求值,为实现多参数函数提供一个递归降解的实现思路——把接受多个参数的函数变成接受单一参数的函数,并且返回接受余下参数而且返回结果的新函数。
在Haskell(纯函数编程)中,函数作为一等公民Currying是应函数式编程而生的。
例子
实现加法的函数
function add(x,y){
return(x+y)
}
function curryiedAdd(x){
return function(y)
return x + y
}
相当于 const add = x => y => x + y;
在此实现中,Currying函数的返回值其实是一个接受剩余参数并且立刻返回计算值的函数, 即它的返回值并没有自动被 Currying化 。所以我们可以通过递归来将 currying 的返回的函数也自动 Currying化。
function curried(fn,...args){
if(args.length>=fn.length){
return fn(...args)
}
return function(...args2){
return curried(fn,...args,...args2)
}
}
Currying使用场景
- 参数复用
function curry(fn,...args1){
return function(...args2){
return fn(...args1,...arg)
}
}
var increment = curry(add,1)
increment(2)===3 //true
var addTen = currying(add, 10)
addTen(2) === 12 // true
-
延迟执行:bind和箭头函数可以实现延迟执行的功能
一个柯里化的函数首先会接受一些参数,然后返回函数,这些函数不会立即计算,而是返回另一个函数,然后参数就被闭包保存,等函数真正求值的时候,参数被使用
提前返回
总结
柯里化
- 逐步接收参数,并缓存供后期使用
- 不立即执行,延后执行
- 符合计算的条件,将缓存的参数,同意传递给执行方法
- 延迟求值的特性需要用到JavaScript中的作用域来保存上一次传进来的参数。