js函数柯⾥化(functioncurrying)
currying⼜称部分求值。⼀个currying的函数⾸先会接受⼀些参数,接受了这些参数之后,该函数不会⽴即求值,⽽是继续返回另外⼀个函数,刚才传⼊的参数在函数形成的闭包中被保存起来。待到函数被真正求值的时候,之前传⼊的所有参数都会被⼀次性⽤于求值。
currying简单的说就是:只传递给函数⼀部分参数来调⽤它,让它返回⼀个函数去处理剩下的参数。你可以⼀次性地调⽤ curry 函数,也可以每次只传⼀个参数分多次调⽤。
下⾯先⽤⼀个简单的例⼦实现函数柯⾥化:
let add = function(x, y){
return x + y
}
把add函数柯⾥化成这样:
var addCurrying = function(x) {
return function(y) {
return x + y
}
}
var increment = addCurrying(1)
var addTen = addCurrying(10)
increment(2)
// 3
addTen(2)
// 12
addCurrying 函数接受⼀个参数并返回⼀个新的函数。调⽤ addCurrying 之后,返回的函数就通过闭
包的⽅式记住了 addCurrying 的第⼀个参数x。currying函数可以复⽤⼀些传⼊的参数,形成闭包保存在函数内,调⽤时只需要传⼊变化的数据。
* @description 柯⾥化函数
* @param {Function} fn 传⼊的需要运算的函数
* @return {Function} 返回函数
*/
let curry = function(fn) {
// args保存需要复⽤的参数
let reuseArgs = Array.prototype.slice.call(arguments, 1)
return function() {
// selfArgs是⾃⾝参数
let selfArgs = Array.prototype.slice.call(arguments)
// 合并⾃⾝参数和复⽤的参数
let mergeArgs = at(selfArgs)
// 计算返回结果
return fn.apply(null, mergeArgs)
}
}
/**
* @description 求和
* @return {Number} 求和的值
js arguments*/
let add = function() {
let args = Array.prototype.slice.call(arguments)
let sum = 0
for (let i = 0; i < args.length; i++) {
sum += args[i]
}
return sum
}
// 3, 4, 5是固定不变,可复⽤的参数
let curryAdd = curry(add, 3, 4, 5)
curryAdd(6) // 结果为18
curryAdd(7, 8) // 结果为27
假设我们要编写⼀个计算每⽉的开销函数。每天结束之前,我们都要记录今天花掉了多少钱。
let monthlyCost = 0
let cost = function(money) {
monthlyCost += money
}
cost(100) // 第1天的开销
cost(200) // 第2天的开销
cost(300) // 第3天的开销
cost(500) // 第30天的开销
console.log(monthlyCost) // 1100
我们其实并不太关⼼每天花掉了多少钱,只是想知道到了⽉底的时候总共花掉了多少钱;所以每个⽉
的前29天,我们都只要保存好当天的开销就⾏了,不要进⾏计算,到了第30天才进⾏求值计算,得到当⽉的开销。currying函数在参数复⽤的同时可以实现延迟计算。
- @description计算当⽉的开销
- @return {Number} 返回计算值
*/
let cost = function () {
let money = 0
for (let i = 0; i < arguments.length; i++) {
money += arguments[i]
}
return money
}
/**
- @description柯⾥化函数
- @param {Function} fn 传⼊的需要运算的函数
- @return {Function} 返回函数
*/
let currying = function (fn) {
// args保存需要复⽤的参数
let reuseArgs = Array.prototype.slice.call(arguments, 1)
// 定义⼀个保存复⽤参数和⾃⾝参数的数组
let args = reuseArgs
return function () {
/
/ arguments是⾃⾝参数
if (arguments.length === 0) {
return fn.apply(null, args)
} else {
[].push.apply(args, arguments)
}
}
}
let costCurrying = currying(cost)
costCurrying(100) // args为[100] 未真正求值
costCurrying(200) // args为[100, 200] 未真正求值
costCurrying(300) // args为[100, 200, 300] 未真正求值
costCurrying(500) // args为[100, 200, 300, 500] 未真正求值
console.log(costCurrying()) // 求值并输出结果:1100
柯⾥化是⾼阶函数应⽤中的⼀种,此处稍微介绍⼀下⾼阶函数,⾼阶函数是指⾄少满⾜下列条件之⼀的函数:函数可以作为参数被传递
函数可以作为返回值输出
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论