javaScript 递归 闭包 私有变量

递归

   递归的概念

    在程序中函数直接或者间接调用自己。

     跳出结构,有了跳出才有结果。

   递归的思想

     递归的调用,最终还是要转换为自己这个函数。

     应用 

  function sum(n){
      if(n ==1) return 1;
      return sum(n-1) + n
  }
  sum(100)

    

  var fib = function (n){
      if(n <=2){
          return 1;
      }
      return fib(n-1) + fib(n-2);
  }
  console.log(fib(5))    

    数组扁平化

    function flatten(arr) {
             return arr.reduce(function(prev,next){
            return prev.concat(Array.isArray(next) ? flatten(next) : next)     },[])     }

    递归的两个必要因素:递归方程,递归结束条件。

闭包

   闭包是指有权访问一个函数作用域中的变量的函数。

    function fun(){
        // 函数内部的变量,函数外部无法访问
        var privateVal = "private value";
  
        // 下面是闭包的精髓:
        // 在函数内部返回一个匿名函数,匿名函数能够访问fun 函数的的变量
        return function(){
          return privateVal;
        }
     }
     fun()(); // 第一个() 执行了fun 函数,返回值是一个匿名函数,第二执行了匿名函数。// 因此输出了"private value”
     // 以下代码,等同于fun()();
     var temFun=fun();
     console.log(temFun()); // 输出:"private value"

    闭包只能取得包含函数中任何变量的最后一个值

   function fun(){
      var result = new Array();
      for(var i=0;i<10;i++){
        result[i] = function(){
          return i;
        }
      }
      return result;
   }
   var result = fun();
  console.log(result[0]()); // 为什么会输出10?

  我们可以通过立即执行函数进行改造,把i 的值绑定在闭包函数内部

 function fun(){

    var result = new Array();
    for(var i=0;i<10;i++){
      result[i]=function(num){
        return function(){
          return num
        }
      }(i)
    }
    return result;   }
  var result = fun();
console.log(result[0]()); // 输出0
  console.log(result[0]()); // 输出1

 

私有变量

  创建私有变量的方法

    1.构造函数

    function Person(name){
      this.getName = function(){
        return name;
      };
      this.setName = function(value){
        name = value;
      }
    }
    var tc = new Person('tc');
    var dj = new Person('dj');
    tc.getName();   // tc
    dj.getName();  // dj

 

    2.静态私有变量

    (function(){
      var name = '';
      Person = function(value){
        name= value;
      }
      Person.prototype.getName = function(){
        return name;
      }
      Person.prototype.setName = function(value){
        name = value;
      };
     })();

 

posted @ 2019-12-05 20:15  柠檬先生  阅读(633)  评论(0编辑  收藏  举报