-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
这种典型的题,一般的做法是函数柯里化与类型转换
- 函数柯里化
- 函数柯里化的解法存在局限性,需要提前定义一个函数,且参数个数跟add参数数量一致,作为函数运行的终止条件,代码如下
function sum(...args) {
return args.reduce((p,n) => p+n,0)
}
// capacity表示参数个数
function curry(fn, capacity) {
let _args = Array.from(arguments).slice(2)
return function f(...args) {
_args = _args.concat(args)
if(_args.length === capacity) {
return fn.apply(null, _args)
} else {
return f
}
}
}
此时add(1,2,3)(4)(5,6)(7,8,9)(10)改成add(1,2,3)时,需要执行 add = curry(sum, 3),重新定义参数个数。有没有更好的解决方案呢?
- fn.toString与类型转换
function add(...args) {
let sum = args.reduce((p,n) => p+n, 0);
const fn = (...params) => {sum = params.reduce((p,n) => p+n, sum); return fn }
fn.toString = () => sum
return fn
}
+add(1,2,3)(4)(5,6)(7,8,9)(10)
这里需要说一下就是add函数的使用要加上 + 号,否则浏览器不会返回1-10的累加值。
Metadata
Metadata
Assignees
Labels
No labels