使用rest参数(可变参数)实现等效的arrow函数和normal函数

时间:2018-11-01 18:50:24

标签: javascript closures currying arrow-functions

我想实现一个箭头功能,该功能等效于另一个正常功能,如下例所示:

f(h)(a1)(a2)...(an)的工作方式类似于h(a1, a2, ..., an)

我认为我必须使用以下伪代码来实现它,但是我不知道如何找出h函数参数的数量?

伪代码:

function h (...varArgs) {

}

var f = (h) => {
    return ...
}

1 个答案:

答案 0 :(得分:1)

单线:

let curry = fn => (fn.length < 2) ? fn : x => curry(fn.bind(0, x))
//

let h = (a, b, c) => a + '/' + b + '/' + c
console.log(curry(h)(1)(2)(3))

读取:“如果arity(参数数量)为0或1,则curry f = f,否则创建一个带有一个参数的函数,该函数调用输入函数的咖喱版本,其中第一个参数固定在闭包中。 / p>

当然,如果未知数(fn.length)不起作用,则此方法将无效。要处理真正的可变参数函数,唯一的选择是在咖喱函数中添加一个to-value方法(toString/valueOf),以便它可能 some 中工作上下文:

let curryVar = fn => x => {
  let b = fn.bind(0, x), f = curryVar(b)
  f.toString = b
  return f
}

let hv = (...xs) => xs.join('|')

console.log(curryVar(hv)(1)(2)(3) + "!")