js的柯里化(Currying)
柯里化是什么?
柯里化: Currying 又称为 卡瑞化或加里化
维基百科: 接收多个参数的函数,变成接受一个单一参数的函数
把add()转为jia()的过程称为 柯里化
function add(x, y, z) {
return x + y + z
}
var result = add(1, 2, 3)
console.log(result)
function jia(x) {
return function(y) {
return function(z) {
return x + y + z
}
}
}
var res = jia(10)(20)(30)
console.log(res)
柯里化的单一职责原则
function foo(x, y, z,) {
x = x + 2
y = y * 2
z = z * z
return x + y + z
}
console.log(foo(1, 2, 3))
function add(x) {
x = x * 2
return function(y) {
y = y + 2
return function(z) {
z = z * z
return function() {
return x + y + z
}
}
}
}
console.log(add(1)(2)(3)())
柯里化的优化
function sum(n, m) {
return n + m
}
function adder(n) {
return function(m){
return n+m
}
}
const add5 = adder(5)
console.log(add5(15))
var add = n => m => {
return n + m
}
var myadd = add(3)(6)
console.log(myadd)
柯里化函数的实现
function add(x, y, z) {
return x + y + z
}
function FhCurrying(fn){
return function(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args)
} else {
return function (...args2) {
return FhCurrying(fn).apply(this,[...args, ...args2])
}
}
}
}
var curryadd = FhCurrying(add)
console.log(curryadd(10)(20)(30))
console.log(curryadd(10,20)(30))
console.log(curryadd(10,20,30))