闭包

闭包形成条件:至少是二个函数,并且是嵌套关系,内部函数还需要访问外部函数的局部变量。

作用:1,私有变量,保护数据安全。

   2,持久化维持数据。

function fn() {

  var num = 10;

  inner(n) {

    num = n

  }

  //inner函数可以改变num的值,所以把inner这个函数的功能返回出去

  return inner

}

//ret 接收到了fn的返回值inner

var ret = fn()

//此时调用ret就是调用了inner,可以改变num的值

ret(100)

-------------------------------------------------------------------------------------------------------------------------------

闭包基本模型

function out() {

  var num = 20

  return function () {

    num++

    console.log(num)

  }

}

 ----------------------------------------------------------------------------------------------------------------------------------

function out ()  {  

  var cache = {}

  function fib (n) {

    //第一个月和第二个月兔子的数量都是一对

    if(n ===1 || n ===2) {

      return 1

    }

    if(cache[n]) {

      return cache[n]

    }else {

      //1,计算兔子数量

      var ret = fil(n-1) + fib(n-2)

      //2,用容器把变量存起来

      cache[n] = ret

      //3,把计算结果返回出去

      return ret;

    }

    return fil(n-1) + fib(n-2)

  }

  //把fib函数作为out函数的返回值

  return fib

}

//ret接收fib函数的返回值

var ret = out()

//此时调用ret就是调用了fib

//这个案例用到了递归,缓存,闭包

全局作用域占用内存,页面关闭或浏览器退出就会释放内存。

函数作用域占用内存,函数调用结束就释放内存。

----------------------------------------------------------------------------------------------------------------------------------

存取钱案例(闭包)

      function kaiHu() {
    var money = 0;
    function saveMoney(name,num) {
      money += num
      console.log(name + '存入' + num + '余额' + money)
    }
    function  setMoney(name,num) {
      money -= num
      console.log(name + '取出' + num + '余额' + money)
    }
    return {
      saveMoney: saveMoney,
      setMoney: setMoney
    }
  },
 var ret = kaiHu()
ret.saveMoney('xm',3000)
ret.setamoney('xm',1000)
原文地址:https://www.cnblogs.com/xiaoxiao95/p/12986382.html