实现一个函数add(1)(2, 3)(4).getValue()
仅支持两次调用
function add(x) {
return function (y) {
return x+y
}
}
console.log(add(2)(3)) // 5
currying
valueOf 获取最终结果
支持无限次调用
function add(x) {
let sum = x;
function resFn(y) {
sum += y;
return resFn
}
resFn.valueOf = function() {
return sum;
}
return resFn;
}
console.log(add(2)(3).valueOf()) // 5
支持多参数、不限次调用
function add(x) {
let sum = x;
function resFn(...y) {
if (y instanceof Array) {
for (let i =0; i < y.length; i++) {
sum += y[i]
}
} else {
sum += y;
}
return resFn
}
resFn.valueOf = function() {
return sum;
}
return resFn;
}
console.log(add(2)(3).valueOf()) // 5
console.log(add(2)(3, 4)(5).valueOf()) // 14
优化
function add(x) {
let sum = x;
function resFn(y) {
for (let i =0; i < arguments.length; i++) {
sum += arguments[i]
}
return resFn
}
resFn.valueOf = function() {
return sum;
}
return resFn;
}
console.log(add(2)(3).valueOf()) // 5
console.log(add(2)(3, 4)(5).valueOf()) // 14
调用()终止并获取sum
function add(x) {
let sum = x;
return function resFn(y) {
if (arguments.length) {
for (let i = 0; i < arguments.length; i++) {
sum += arguments[i]
}
return resFn;
}
return sum
}
}
console.log(add(2)(3)()) // 5
console.log(add(2)(3, 4)(5)()) // 14
指定数量参数返回sum
function add() {
let args = [...arguments];
function resFn() {
args = [...args, ...arguments]
if (args.length >= 3) {
return args.slice(0, 3).reduce((a, c) => a+c, 0)
}
return resFn;
}
return resFn();
}
console.log(add(2)(3)(4)) // 9
console.log(add(2, 3, 4)) // 9
console.log(add(2, 3)(4)) // 9
console.log(add(2)(3, 4)) // 9
参考: