什么是闭包?闭包的优缺点?

什么是闭包?闭包的优缺点?

想要理解闭包,首先要知道变量作用域的概念。

1. 变量作用域

变量的作用域有两种:全局变量和局部变量。
JS语言定义了:函数内部可以直接读取全局变量,但是函数外部无法读取函数内部的局部变量。
注意点:
大家都知道,变量是需要用var关键字声明的。但是javascript中也可以隐式的使用变量,就是不用声明,直接使用。而且,千万注意,javascript把隐式声明的变量总是当成全局变量来使用的
没有var,let声明的变量或者在函数外部声明的变量都是全局变量;使用 var 声明的变量属于所在函数,不管在函数的哪个位置出现,等价于在函数一开始声明。该变量为局部变量,局部变量比同名全局变量的优先级高

2. 如何从外部读到函数内部的局部变量?

某些情况下,需要从外部获取函数内部的局部变量,但是上面已经提到,正常情况下,是不允许访问的,需要通过一定的方法才能实现
那就是,在函数内部,在定义一个函数

function goPlat(){
  var t=888;//局部变量
  function showNumber(){
  console.log(t);
    }
  return showNumber
}  
this.result=goPlat();
this.result();//888

在上面的代码中,函数goPlat内部的变量对函数showNumber都是可见的
反之,函数showNumber里面的变量对函数goPlat就是不可见的
这就是JS中的链式作用域结构,子对象会向上一级一级寻找父对象的变量
所以父对象的变量对于子对象来说都是可见的
所以,竟然函数showNumber可以读取函数goPlat里面的t,那么把函数showNumber作为返回值,不就可以在外部访问局部变量t了。

3. 闭包的概念

在上面的代码中,函数showNumber就是一个闭包,闭包就是能够读取其他函数内部变量的函数
由于在JS中,只有函数内部的子函数才能读取局部变量,所以闭包也可以理解为:定义在一个函数内部的函数
所以本质上:闭包是连接函数内部和函数外部的桥梁

4. 闭包的用途

闭包最大的两个用途:使得外部能够访问函数内部的变量;第二个就是让这些变量的值始终保存在内存中,不会在goPlat()调用后被清除

4. 使用闭包的注意点

  1. 由于闭包会使得函数内部的变量保存在内存中,内存消耗很大,不能滥用闭包,否则会引起网页性能问题,在IE中导致内存泄漏,解决方法时:在退出函数之前,将不使用的局部变量删除。
  2. 闭包会在父函数外部改变父函数内部局部变量的值,所以如果你把父函数当做对象使用,把闭包当成公共的方法,把内部变量当成私有属性,这时一定要小心,不要随意改变父函数内部变量的值。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值