JS闭包笔记

一句话

JavaScript中的闭包是一个类型的应用,ta的原理是变量解析。

原理

每次定义一个函数,都会产生一个作用域链(scope chain)。
为什么强调函数?这意味着当你保留一个函数的引用时,也会保存ta的作用域链。包括其中的上层函数的变量等等。
如:

//有这么一坨可爱的家人
F 爷爷() {
  var 小明;
  F 爸爸(){
    //给小明吃棒棒糖
  }
}
爷爷() //执行爷爷函数,小明出现,小明吃完帮帮糖后,函数结束,清内存,小明消失了
爷爷() //同上

怎么样让小明记住自己吃了多少次糖呢?
我们需要保留一个函数的引用,保存小明。
爷爷?每次运行爷爷都会”var 小明;“,
爸爸!只要想办法保留爸爸的引用,爷爷只会执行一次,这样就可以对同一个小明多次喂糖了。(计数器)

//有这么一坨可爱的家人
F 爷爷() {
  var 小明;
  return F 爸爸(){
    //给小明吃棒棒糖
    return 小明;
  }
}
var 李刚=爷爷()//此时李刚是爸爸的引用
李刚() //由于爸爸引用始终存在,作用域链的原因,爷爷不会被内存清掉
。。。
李刚=null //不引用爸爸了,删除闭包

看下实例

//这样可以
function add() {
  var count=0;
  return function() {
    count = count +1;
    return count;
  }
}

var x=add()
num=x(); //num=1;
num=x(); //num=2;
//另一种写法
var add = (function () {
    var counter = 0;
    return function () {return counter += 1;}
})();

add(); //counter=1
add(); //counter=2
add(); //counter=3
//x不是inner函数的引用,而是count。
//这样不管执行多少次x(),返回值始终为1。
function add() {
  var count=0;
  return function() {
    count = count +1;
    return count;
  }
}
var x=add()()
num=x; //num=1;
num=x; //num=1;
//x是outer函数的引用,执行完后,内存就会清除
//这样不管执行多少次x(),返回值始终为1
function add() {
  var count=0;
  return function() {
    count = count +1;
    return count;
  }
}
var x=add
num=x()(); //num=1;
num=x()(); //num=1;

参考

https://www.cnblogs.com/wx1993/p/7717717.html
https://www.zhihu.com/question/34547104
https://www.w3school.com.cn/js/js_function_closures.asp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值