如何理解 apply this?

作者站长头像
站长
· 阅读数 9

在看手写 柯里化的实现时候,遇到了关于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 ,不能直接调用

回复
1个回答
avatar
test
2024-07-05

首先是我找到的关于这个函数的解释:柯里化是一种将接受多个参数的函数转换成接受一个单一参数(最初函数的第一个参数)的函数,并返回接受余下的参数且返回结果的新函数的技术。这个函数接受一个函数作为参数,并返回一个新的函数。新函数可以接受任意数量的参数,并在参数数量达到原始函数所需的数量时调用原始函数。如果参数数量不足,则返回一个新函数,该函数将接受更多参数,并将它们与之前的参数合并,直到参数数量足够为止。

那么很明显这里的“业务需求”就是要让func函数对象接收多个参数,要用apply或者call(区别在于用call要手动把数组展开传入多个参数),如果你直接调用func函数它只会接受一个参数,传入是数组就只是传入数组对象本身,并不会展开参数

那么为什么apply的第一个参数要传一个this呢?这是因为curried函数是一个闭包,函数的作用域就是这个闭包的上下文中,args是在这个函数的作用域里定义的,这意味着只有在curried函数内部才能访问args,才能取到args里面的元素。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容