实现一个函数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()) // 5console.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()) // 5console.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)()) // 5console.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)) // 9console.log(add(2, 3, 4)) // 9console.log(add(2, 3)(4)) // 9console.log(add(2)(3, 4)) // 9
参考:
