coolliyong.github.io

函数科里化

// test("chen", 45, 789, 284.2, 178) ==> test2("chen")(45)(789)(284.2)(178)()
// (name, id, num, score, height)
//柯里化
function test(name) {
  return id => {
    return num => {
      return score => {
        return height => {
          console.log(
            `name:${name},id:${id},num:${num},score:${score},height:${height}`
          )
        }
      }
    }
  }
}
//柯里化 调用
test('柯里化')(1)(999)('local')(180)

//柯里化封装
function currying(fn) {
  let args = []
  return function() {
    //生成新的方法
    if (fn.arguments === 0) {
      //没有参数时执行
      fn.call(this, args)
    } else {
      //修改数组的push 绑定到args 上面,参数传入call arguments 的 数组
      Array.prototype.push.call(args, [].splice().call(arguments))
      // 返回argument.callee
      return arguments.callee
    }
  }
}