我们在【从一道面试题说起】闭包&函数柯里化】认识了函数科里化,本文我们来了解下函数反柯里化。
函数反柯里化其实就是把this泛化的过程。
在认识它之前,首先思考一个问题,如何让类数组借用数组的push方法,应该很容易想到,可以借助Array.prototype.push方法。
1 | (function() { |
继续思考,如何实现一个push函数,使得调用push([1,2,3], 4)之后,a数组变为[1, 2, 3, 4]。
1 | const a = [1,2,3] |
其实要做的无非就是封装一个方法,返回一个函数赋值给push,这个函数接收两个参数,arr和value,执行Array.prototype.push,把第一个参数arr作为this对象,value作为要push的值。
1 | function uncurrying() { |
再思考,这样封装真的达到可变和不变的分离了么?并没有。如果再要实现一个slice(a,1)呢?那不得再写一个新的uncurrying函数?所以,对于uncurrying函数至少还有两点可以改进:
- 返回的闭包函数中Array.prototype.push抽离到uncurrying函数外面
- 闭包函数中的不用实参,arguments[0]为指定的this值,此外都是传入方法中的实际参数。
这样一来,方法中的this,不仅仅局限于定义时候的对象,而是加以泛化。这个就是函数反柯里化方法。也就是说uncurrying就是 把this泛化的过程提取出来 的方法。
1 | const a = [1,2,3]; |