在前端经常面试中,可能会运到这样一个问题涉及到柯理化的题目
add(1)(2)(3) = 6;
add(1, 2, 3)(4) = 10;
add(1)(2)(3)(4) = 15;
这个问题的目的是想让add执行之后返回一个函数能够继续执行,最终运算的结果是所有出现过的参数之和,而这个题目的难点在于参数的不固定,我们不知道函数会执行几次,因此不能使用前面封装的createCurry通用公式来转换一个柯理化函数,只能自己封装,该怎么样操作呢?在此之前,补充两个非常重要的知识点。
一个是ES6函数的不定参数。假设我们有一个数组,希望把这个数组中所有的子项展开传递给一个函数作为参数,那么应该怎么做?
// 大家思考一下,如何将args数组的子项展开作为add的参数传入
function add(a, b, c, d){
return a + b + c + d;
}
var args = [1, 2, 3, 4];
在ES5中,我们可以借助之前学习过的apply来达到这个目的。
add.apply(null,args);
然而在ES6中,提供一种新型的语法来解决这个问题,那不就是不定参数?写法如下:
add(...args);
这两种写法是等效的,在接下来的实现中,我们会用到不定参数的特性。
第二个要补充的就是知识点函数的隐形转换
当函数直接参与其他计算得时候,函数会默认调用toString方法,直接将函数体转换为字符