递归

  递归的概念

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

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

   递归的思想

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

     应用 

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

最新文章

  1. RPC原来就是Socket——RPC框架到dubbo的服务动态注册,服务路由,负载均衡演化
  2. Spring配置JNDI和通过JNDI获取DataSource
  3. 访问其他程序的SheardPreferents
  4. 防止SVN冲突,Elipse资源同步介绍
  5. 将redis作为windows系统的系统服务
  6. ecshop 加广告出现广告位的宽度值必须在1到1024之间
  7. oracle创建索引后sqlldr导入错误
  8. ORACLE RAC 下非缺省端口监听配置(listener.ora tnsnames.ora)
  9. 【Android 界面效果33】二级listview列表
  10. 开启URL伪静态的方法
  11. Python开篇
  12. JVM类加载机制以及类缓存问题的处理
  13. SQL中哪些情况会引起全表扫描
  14. Linux命令学习总结:ls
  15. sed:-e 表达式 #1,字符 10:未终止的“s”命令
  16. Fatal error: Uncaught Error: Call to undefined function mysqli_connect()
  17. 【Spark-core学习之七】 Spark广播变量、累加器
  18. HNOI2014做题笔记
  19. git报ssh variant &#39;simple&#39; does not support setting port解决办法
  20. &lt;&lt;attention is all you need&gt;&gt;速读笔记

热门文章

  1. css将两个元素水平对齐,兼容IE8
  2. React Autocomplete(自动完成输入)示例教程
  3. redis数据库的set去重操作
  4. [洛谷P4436] HNOI/AHOI2018 游戏
  5. 【微信小程序】基础组件--view text image
  6. tweenMax+如何让数字由初始值动画到结束的值
  7. 交互输入与for语句
  8. adb打开系统设置的命令
  9. Java——this
  10. 倍增O(1)求区间&amp;值与|值