实现函数add的柯里化
function add(x, y, z) {
// console.log(this)
return x + y + z
}
定义柯里化函数,接受一个函数作为参数,返回一个可以实现后的柯里化函数
function curring(fn) {
function curried(...args) {
// console.log(this)
if (args.length >= fn.length) {
return fn.call(this, ...args) //如果不使用call绑定this,那么这里默认绑定的this是window,那么在下方调用的时候如carrAdd.call('call', 1, 2, 3) 就会得到两个不同的this
}
else {
function curried2(...args2) {
return curried.apply(this, [...args, ...args2])
}
return curried2
}
}
return currid
}
调用函数得到结果
var carrAdd = curring(add)
console.log(carrAdd(10)(20)(30))
执行步骤
- 柯里化函数传入add函数得到carrAdd
- 首次执行carrAdd(10)这时进入if else判断走else,并且返回一个新定义的curried2的函数
- 继续执行carrAdd(10)(20)相当于执行curried2(20),此时形成闭包args类数组为[10],结构赋值再调用重新调用curried(10,20)
- 如是继续执行
网友评论