递归

  递归的概念

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

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

   递归的思想

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

     应用 

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

javaScript 递归 闭包 私有变量的更多相关文章

  1. JavaScript 使用闭包防止变量污染

    javaScript在多人协作时,如果定义过多的全局变量 有可能造成全局变量命名冲突,使用闭包来解决功能对变量的调用 将变量写到一个独立的空间里面 就是闭包里面 var name = "外部 ...

  2. JavaScript 使用闭包保护变量 防止污染

    使用JavaScript编写插件或团队协作时,可使用闭包来解决此类以下两个问题: 1.定义过多全局变量,可能会造成全局变量命名冲突: 2.在插件内定义变量,需要保护该变量不被轻易修改: 优点:可以把局 ...

  3. javaScript的闭包 js变量作用域

    js的闭包 js的变量作用域: var a=90; //定义一个全局变量 function test(){ a=123; //使用外层的 a变量 } test(); document.write(&q ...

  4. JavaScript函数表达式、闭包、模仿块级作用域、私有变量

    函数表达式是一种非常有用的技术,使用函数表达式可以无需对函数命名,从而实现动态编程.匿名函数,是一种强大的方式,一下总结了函数表达式的特点: 1.函数表达式不同于函数声明,函数声明要求有名字,但函数表 ...

  5. 读javascript高级程序设计03-函数表达式、闭包、私有变量

    一.函数声明和函数表达式 定义函数有两种方式:函数声明和函数表达式.它们之间一个重要的区别是函数提升. 1.函数声明会进行函数提升,所以函数调用在函数声明之前也不会报错: test(); functi ...

  6. JavaScript中是如何定义私有变量的

    前言 JavaScript并不像别的语言,能使用关键字来声明私有变量. 我了解的JavaScript能用来声明私有变量的方式有两种,一种是使用闭包,一种是使用WeakMap. 闭包 闭包的描述有很多种 ...

  7. Javascript 闭包与变量

    1.闭包与变量 JavaScript中的作用域链的机制引出了一个副作用,即闭包只能取得包含函数中任何变量的最后一个值.闭包所保存的是整个变量对象,而不是某个特殊的值. 1 2 3 4 5 6 7 8 ...

  8. JavaScript 执行环境(执行上下文) 变量对象 作用域链 上下文 块级作用域 私有变量和特权方法

    总结自<高程三>第四章  理解Javascript_12_执行模型浅析   JS的执行环境与作用域  javascript高级程序第三版学习笔记[执行环境.作用域] 在javascript ...

  9. JavaScript中闭包实现的私有属性的getter()和setter()方法

    注意: 以下的输出都在浏览器的控制台中 <!DOCTYPE html> <html> <head> <meta charset="utf-8&quo ...

随机推荐

  1. 线性渐变css

    从上到下的线性渐变: #grad { background: -webkit-linear-gradient(red, blue); /* Safari 5.1 - 6.0 */ background ...

  2. CSS行内框(内联元素)

    行内框在一行中水平布置.可以使用水平内边距.边框和外边距调整它们的间距.但是,垂直内边距.边框和外边距不影响行内框的高度.由一行形成的水平框称为行框(Line Box),行框的高度总是足以容纳它包含的 ...

  3. 通过runtime对类别进行属性的扩展

    category使用  objc_setAssociatedObject/objc_getAssociatedObject 实现添加属性 属性 其实就是 get/set 方法. 我们可以使用 objc ...

  4. Redis怎么做持久化

    1.redis持久化的两种方式 2.两种持久化方式区别 3.两种持久化方式的使用场景 1.Redis 是内存型数据库,一般来用作缓存.保存在内存的数据有一个特点, 就是断电消失,因此一旦 Redis ...

  5. C# wpf image绑定viewModel没有显示图片

    在wpf绑定图片,用viewModel的图片绑定image 我是用viewModel.cs public class viewModel:INotifyPropertyChanged { #regio ...

  6. 关于Mysql 修改密码的记录

    初次安装后完毕,使用管理员身份进入cmd界面, 输入" mysql -u root -p",出现"Enter password:",直接回车输入" s ...

  7. VB Open 函数详解 打开、关闭、读、写文件

    (一)打开和关闭文件      1.顺序文件     打开顺序文件,我们可以使用Open语句.它的格式如下:Open pathname For [Input |Output |Append] As [ ...

  8. 洛谷 P2704 [NOI2001]炮兵阵地 (状态压缩DP+优化)

    题目描述 司令部的将军们打算在NM的网格地图上部署他们的炮兵部队.一个NM的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P" ...

  9. GNU ARM eclipse 安装--Linux 版本

    官方网站:https://gnu-mcu-eclipse.github.io/ 1. 工具链安装 1.1 xpm 安装 安装 nodejs: sudo apt-get install nodejs s ...

  10. zookeeper之三 ZKClient客户端的使用

    ZKClient在原生API接口上进行了包装,同时在内部实现了诸如session超时重连.watcher反复注册等功能,使得zookeeper客户端繁琐的细节对开发人员透明.下面将从以下几个方面来使用 ...