前言
昨天我又又又碰到一道很像柯里化函数的题了,但是它很像却不是柯里化。所以简单记录一下
函数柯里化
针对参数长度固定的函数
function curry(fn, ...args) {
if (args.length >= fn.length) {
fn(...args)
} else {
return function (...args2) {
return curry(fn, ...args, ...args2)
}
}
}
const add = (a, b, c) => a + b + c
//参数长度固定的时候
console.log("参数长度固定的时候:")
const curryAdd = curryTwo(add)
console.log(curryAdd(1)(2)(3)) //6
console.log(curryAdd(1, 2)(3)) //6
console.log(curryAdd(1)(2, 3)) //6
针对参数不确定的函数的柯里化
function add1(...args) {
//求和
return args.reduce((a, b) => a + b)
}
function curry2(fn, ...args) {
return function (...rest) {
if (rest.length) {
return curry2(fn, ...args, ...rest)
} else {
return fn.call(this, ...args)
}
}
}
let addFn = curry2(add1)
console.log('参数不固定,手动触发')
console.log(addFn(1)(2)(4, 5)()) //12
题目
js实现一个加法器,能够满足add(1)(2)=3;add(1)(2)(3)=6?
题目关键点:闭包+toString的重写
//参数长度不固定-不手动触发
//关键点闭包+重写toString方法
function add3(a) {
var tmp = function (b) {
a = a + b;
return tmp;
};
tmp.toString = function () {
return a;
};
return tmp;
}
console.log("参数不固定且非手动触发")
console.log(add3(1)(2)(3)); //6
console.log(add3(1)(2)(3)(4)); //10
这里console.log是没法打印出结果的,我尝试了alert出结果的方法是可以的