了解js闭包^ ^

问:js闭包是什么?
想在一个函数内部也有限权访问另一个函数内部的变量,闭包就是用来解决这一需求的,闭包的本质就是在一个函数内部创建另一个函数。
闭包的生成有三个必要条件(缺一不可)
1.在函数 A 内部直接或者间接返回一个函数 B
2. B 函数内部使用着 A 函数的私有变量(私有数据)
3. A 函数外部有一个变量接受着函数 B
形成了一个不会销毁的函数空间,就是[闭包空间]。
我们管这个不会销毁的 a 函数的执行空间叫做 闭包空间
把函数 a 里面返回的 函数 b, 叫做函数a 的 闭包函数
官方给的定义有一句话: 闭包➡函数内部的函数
比如这样:
100

我们可以看到,在全局作用域下有一个函数a,a作用域里面有num和b,b作用域里面执行控制台输出a 的私有变量num,此时这里的b函数就形成了一个闭包,因为b函数里面需要访问到a作用域下的num变量,而他们不处在同一个作用域中,所以两者相互牵引,需要输出num,上面a中的变量num就必须得在,作用域链查找到a的时候找到num了,输出num的时候,垃圾回收机制会认为b还没有执行完成,因为此时的作用域链查找已经到了a作用域下,所以不会清理num的内存空间;所以这就会带来一个问题:如果我们多次的使用闭包,则会给我们的程序带来内存占用过多,导致性能问题。
总结一下闭包的优点与缺点:
优点:
1.保护函数内的私有变量安全;
2.延长了变量的生命周期;
3.利用闭包函数可以访问函数内部的私有变量(后两点因为执行空间不销毁都会消耗内存)。
缺点:
就是被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null。
最后总结:
1.作用域链查找变量的方式是一层一层的往上查找,直到找到为止,如果找到window全局作用域还未找到,就会报undefined;
2.嵌套函数中,因为不在同一作用域,正常情况下内外部函数是访问不到内部函数的,但是通过闭包可以实现;
3.尽可能少的使用闭包,因为会造成内存消耗大以及有可能造成内存泄露(慎用)。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值