闭包封装变量之封装一个阶乘

Posted 一声蔷薇udVkP

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了闭包封装变量之封装一个阶乘相关的知识,希望对你有一定的参考价值。

封装一个阶乘

思路:

  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));

以上是关于闭包封装变量之封装一个阶乘的主要内容,如果未能解决你的问题,请参考以下文章

24 jQuery——对象的封装闭包匿名自调用函数

javascript中函数的闭包自调用

Java中面向对象的三大特性之封装

JavaScript闭包应用之数据独立

js中的闭包之我理解

js闭包