在看手写 柯里化的实现时候,遇到了关于this难以理解的地方,期望解惑
function myCurry(func){
console.log('func: ', func);
//需要具备两个参数 arg 以及 func.length
return function curried(...args){
console.log('args: ', args);
if(args.length>=func.length){
return func.apply(this,args)
}else{
return function(...args2){
console.log('args2: ', args2);
return curried.apply(this,args.concat(args2))
}
}
}
}
完整代码如上,比较难理解的是 func.apply ,不能直接调用
首先是我找到的关于这个函数的解释:
柯里化是一种将接受多个参数的函数转换成接受一个单一参数(最初函数的第一个参数)的函数,并返回接受余下的参数且返回结果的新函数的技术。
这个函数接受一个函数作为参数,并返回一个新的函数。新函数可以接受任意数量的参数,并在参数数量达到原始函数所需的数量时调用原始函数。如果参数数量不足,则返回一个新函数,该函数将接受更多参数,并将它们与之前的参数合并,直到参数数量足够为止。
那么很明显这里的“业务需求”就是要让func函数对象接收多个参数,要用apply或者call(区别在于用call要手动把数组展开传入多个参数),如果你直接调用func函数它只会接受一个参数,传入是数组就只是传入数组对象本身,并不会展开参数
那么为什么apply的第一个参数要传一个this呢?
这是因为curried函数是一个闭包,函数的作用域就是这个闭包的上下文中,args是在这个函数的作用域里定义的,这意味着只有在curried函数内部才能访问args,才能取到args里面的元素。