美文网首页
级联、记忆

级联、记忆

作者: 灯光树影 | 来源:发表于2018-09-01 11:21 被阅读0次

一、级联

级联就是链式调用,形式如obj.a().b().c()

  • 分析
    级联是怎么实现的呢?我们知道只有对象才可以调用对象方法,那么obj.a()返回一个对象就可以调用返回对象的方法c。
    值得注意的是:obj.a()不一定要返回obj对象,可以返回其它的对象(几乎没见过)
  • 实现
    • 单例模式
    var obj = {
      a : function(){
        // some code here
        return this;
      },
      b : function(){
        // some code here
        return this;
      }
    }
    
    • 构造器模式
    function Obj(){
      this.a = function(){
        // some code here
        return this;
      }
      this.b = function(){
        // some code here
        return this;
      }
    }
    
    • 构造器 + 闭包
    function createObj(){
      // private code
    
      // 对外暴露的对象类型
      function Other(){
        this.a = function(){
          // some code here
          return this;
        }  
        this.b = function(){
          // some code here
          return this;
        }
      }
      return new Other();
    }
    

二、记忆

函数可以将先前操作的结果记录在某个对象中,避免重复无谓的操作

  • 例子 —— fibonacci数列
    • 原本的函数:
    // 默认输入的x是自然数
    function fibonacci(x){
     if(x == 0 || x == 1){
       return 1;  
     }else{
       return fibonacci(n-2) + fibonacci(n-1);
     }
    } 
    
    可以发现,在递归过程中,函数进行了许多不必要的重复操作。
    • 记忆的函数:
    function fibonacci(){
     // 用于记忆的数组初始化
     var memo = [1, 1];
     // 实际操作的函数,默认输入的x是自然数
     function fib(x){
       // 期待记忆数组已有该记录
       var result = memo[x];
       // 如果没有
       if(typeof result !== 'number'){
         // 计算
         result = fib(x-2) + fib(x-1);
         // 记录该值
         memo[x] = result;
       }
       // 返回结果
       return result;
     }
     return fib;
    }
    
    改进后的函数不断把已经计算过的值记录起来,减少了不必要的重复计算。
  • 通用的记忆函数构造器
    • 构造器的实现
    /**
      记忆函数构造器
      @param memo {array} 记忆数组 
      @param formula {function} 逻辑处理函数
      @return recur {function} 操作函数
    */
    var memoizer = function(memo, formula){
        // 复制记忆数组
        var recurMemo = memo.slice(0);
        // 实际的操作函数 —— 返回第n个数的值
        var recur = function(n){
            // 期待在记忆数组中找到结果
            var result = recurMemo[n];
            // 如果没有
            if(typeof result !== 'number'){
                /*
                计算:
                    把实际的操作函数recur传递给formula,以便formula使用recur进行逻辑操作
                */
                result = formula(recur, n);
                // 记录
                recurMemo[n] = result;
            }
            return result;
        }
        return recur;
    }
    
    • 构造器的使用
    // 计算fibonacci数列
    var fib = memoizer([1,1], function(recur, n){
       return recur(n-2) + recur(n-1); 
    });
     
    // 计算阶乘
    var fatorial = memoizer([1,1], function(recur, n){
       return n * recur(n-1);
    });
    

相关文章

网友评论

      本文标题:级联、记忆

      本文链接:https://www.haomeiwen.com/subject/tjjewftx.html