封装一个阶乘

思路:

  1. 在闭包中定义一个对象,key为传进来参数转成的字符串(数组的join方法)
  2. 判断对象中是否有传进来的值,有返回,否则计算,并将阶乘的结果存到这个对象中。
  3. 返回一个函数。

具体实现过程如下:

  // 封装一个阶乘函数
        // var mult = function(){
        //     var a = 1;
        //     for(let i=0;i<arguments.length;i++){
        //         a = a*arguments[i]
        //     }
        //     return a
        // }
        // console.log(mult(1,2,3));

        // ////////////////////////////////////////
        // 优化1,把阶乘过的结果存起来
        // var catche = {};
        // var mult = function () {
        //     var a = 1;
        //     let b = Array.prototype.join.call(arguments, ",");
        //     if (catche[b]) {
        //         return catche[b]
        //     } else {
        //         for (let i = 0; i < arguments.length; i++) {
        //             a = a * arguments[i];
        //         }
        //         catche[b] = a;
        //         return a
        //     }
        // }

        // console.log(mult(1, 2, 3));
        // console.log(mult(1, 2, 3));

        // ////////////////////////////////////////
        //优化2,将存结果的对象封装在闭包中
        var mult = (function () {
            var catche = {};
            var calculate = function(){
                var a = 1;
                for (let i = 0; i < arguments.length; i++) {
                    a = a * arguments[i];
                }
                return a;
            }
            return function () {
                let args = Array.prototype.join.call(arguments, ",");
                if (args in catche) {
                    return catche[args]
                }
                return catche[args] = calculate.apply(null,arguments) 
            }
        })();
        
        console.log(mult(1, 2, 3));
        console.log(mult(1, 2, 3));

一声蔷薇udVkP
25 声望3 粉丝

未来可期