柯里化(currying)又称部分求值。一个柯里化的函数首先会接收一些参数,接收了这些参数后,该函数并不会立即求值,而是继续返回另外一个函数,刚才传入的参数在函数形成的闭包中被保存起来。待到函数被真正需要求值的时候,之前传入的所有参数都会被一次性用于求值。

    假设当前需要根据人员的不同打印出:我是 XX 公司 XX 部门的XX,XX 岁,代码一定可以写作:

    1. function print(company, department, name, age) {
    2. console.log(`我是 ${company} ${department} 部门的 ${name},${age} 岁`);
    3. }
    4. print('ali', 'F77', 'zhangsan', 20);
    5. print('ali', 'F77', 'lisi', 30);

    大家可以想一想,如果你们公司同一个部分有几千上万人呢?
    与此同时可以发现,对于“公司”和“部门”,都是一样的,就没必要都作为参数传递了,除了进行最简单的固定字符的字符串拼接,还可以写作:

    1. function curry(company, department) { //接收固定的公司、部门
    2. return function (name, age) {
    3. console.log(`我是 ${company} ${department} 部门的 ${name},${age} 岁`);
    4. }
    5. }
    6. let print = curry('ali', 'F77'); // 传递固定的公司、部门
    7. print('zhangsan', 20);//调用 return 出来的函数并传变化的参数
    8. print('lisi', 30);

    这个示例能让你最直观地看到柯里化函数的作用,再重复一次:如果方法中固定了某些参数,你可以得到接收余下参数的一个函数
    也就是说,柯里化函数调用后,得到的是一个函数。柯里化可以帮助我们把相同的参数固定下来,把任意的多参函数通过固定参数的方式,变为单参函数,这样就不用每次调用函数的时候都去反复传递这些一样的参数了。

    自己手写了一个科里化函数,大家可以作为一个参考。。。。

    1. function awei(sn, cn, score) { //自己需要输出的函数
    2. console.log(sn, cn, score);
    3. }
    4. let foo = curry(awei, "lovo"); //调用柯里化函数 后面进行传参就行。如果传的参数大于等于形参个数,就输出
    5. console.log(foo);
    6. foo("f77");
    7. foo(80);
    8. //封装好的科里化函数
    9. let temp = [];
    10. function curry(fn, ...args1) { // 参数=>函数,形参
    11. temp = [...args1]; //获取第一次的实参
    12. return function (...args2) { //需要返回出去的函数
    13. temp.push(...args2); //将形参 push 进数组
    14. if (temp.length == fn.length) { //进行判断
    15. fn(...temp);
    16. } else {
    17. curry(fn, ...temp); //运用递归再次调用自己
    18. }
    19. }
    20. }