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

什么是闭包?闭包的优缺点?,第1张

想要理解闭包,首先要知道变作用域的概念。
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()调用后被清除。

5. 使用闭包的注意点

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/944994.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-18
下一篇 2022-05-18

发表评论

登录后才能评论

评论列表(0条)

保存