当我读到关于curry函数的内容时,我认为很难创建一个用于构建嵌套函数的递归。然后我看一下ramda的实现,就是这样 是的,用任意数量的参数创建一个curried函数。然后, 为什么不用这样的字符串构建它:
function curry(fn, arity) {
arity = typeof arity === 'undefined' ? fn.length : arity
if (arity < 1) {
return fn
}
function build(n, space = 2, args = []) {
if (n < 1) {
args = args.map(arg => 'a' + arg)
return `fn(${args.join(', ')})`
} else {
return `function (a${n}) {\n${' '.repeat(space)}` +
`return ${build(n - 1, space + 2, args.concat(n))}\n` +
`${' '.repeat(space - 2)}}`
}
}
const curryCreator = new Function('fn', 'return ' + build(arity))
return curryCreator(fn)
}
可以像这样使用:
function sum5(a, b, c, d, e) {
return a + b + c + d + e
}
const sum = curry(sum5)
哪会产生这个:
function (a5) {
return function (a4) {
return function (a3) {
return function (a2) {
return function (a1) {
return fn(a5, a4, a3, a2, a1)
}
}
}
}
}
将new Function
用于此功能有多糟糕?
用例就是生成一个函数和参数占位符
在上面的例子中。我的问题比this更具体
解决eval
或new Function
的一般用例。如你看到的
在我的例子中,它是一个私有函数,不会在另一个函数中调用
的地方。