ymcdhr / js-points

js知识点
3 stars 3 forks source link

手写源码—js函数式编程与柯里化 #8

Open winniyoung opened 6 years ago

winniyoung commented 6 years ago

1、函数的记忆功能,可以缓存数据,优化代码执行性能,常常在递归方法里面使用

(1)函数利用闭包实现将数据记录在内存中
(2)示例代码:

    // 利用闭包,构造一个记忆函数
    var add = function(num1){

        return function(num2){

            return num1 + num2;
        }
    };
    // ES6写法
    // var add = num1 => (num2 => num1 + num2);

    // 返回一个function,将num1赋值为10,存在存储中
    var add10 = add(10);

    // 输出30
    console.log(add10(20));

2、函数的柯理化

(1)在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。
(2)事实上柯里化是一种“预加载”函数的方法,通过传递较少的参数,得到一个已经记住了这些参数的新函数,某种意义上讲,这是一种对参数的“缓存”,是一种非常高效的编写函数的方法
(3)将函数柯里化示例:

    // ES5
    function curry(fn) {
        function _c(restNum, argsList) {
            return restNum === 0 ?
            // fn.apply(null, argsList) 
            fn.apply(null, argsList) :
            function(x) {
                return _c(restNum - 1, argsList.concat(x));
            };
        }
        return _c(fn.length, []);
    }

    // 使用
    var plus = curry(function(a, b) {
        return a + b;
    });

    // 3
    console.log(plus(1)(2));
ymcdhr commented 3 years ago

柯理化的应用场景?

参考:https://muyiy.cn/blog/6/6.2.html#%E6%9F%AF%E9%87%8C%E5%8C%96

1、延迟计算

2、动态创建函数

3、参数复用