闭包是什么?

115 阅读3分钟

什么是闭包?

  • 底层原理: 函数内部的局部作用域变量不能在函数外部直接调用;因为函数执行结束,执行空间就会被销毁.局部作用域变量也会被销毁;
  • 闭包概念: 闭包就是生成一个不会被销毁的执行空间,延长局部作用域变量的生存周期,在函数外部可以操作函数内部的局部作用域变量;
  • 适用场景: 因为 JavaScript 存在全局变量污染,也就是全局变量非常容易被其他程序/函数误操作;我们为了保证数据的安全,往往需要将全局变量设定成函数的局部变量,再通过闭包的语法调用操作最后变量数据;
  • 闭包的作用:
  1. 为了防止全部变量污染;
  2. 生成独立的作用域,延长变量的生成周期(应用的比较少)
  • 闭包的优点和缺点:
  1.优点: 防止全局变量污染;
  1.缺点: 调用使用不方便;
  
  2.优点: 延长变量的生命周期;
  2.缺点: 容易造成内存泄露;
  
  3.优点: 创建不会被销毁的执行空间;
  3.缺点: 占用内存降低执行效率;
  • 闭包的基本语法:
  • 函数的返回值是另一个函数.
  • 例如: 在函数A中,返回值是另一个函数B.在函数B中操作调用函数A中设定的局部作用域变量,在函数A外使用变量存储函数A的执行结果返回值,也就是存储的是 函数A return 函数B;
         function 函数(){
                            return 匿名函数(){}
                        }

                        const 变量 = 函数()


                        const 变量 = ( function(){ return 匿名函数(){} } )()

闭包的套路:
   function 函数a(){
                    局部变量1
                    局部变量2
                    局部变量3
                    .....


                    return 匿名函数(){

                        操作 函数a 的局部变量

                    }

                }
                
                const 变量 = 函数a() ;
                    变量中存储的是函数a return 的 匿名函数的内存地址

                变量()
                    变量的调用 就是 匿名函数的调用 就是 函数a局部变量的操作

生成不会被销毁的执行空间:

  • 概念: 如果执行空间中的数据正在被外部程序使用,此时执行空间不会被销毁释放;
  • 函数return的是引用数据类型,函数外有变量存储,函数的执行结果返回值是引用数据类型(数组,对象,函数) ,函数的执行空间不会被销毁;
解释:
 1. 如果函数的返回值是基本数据类型;
    那么,函数外部的变量中存储的是: 基本数据类型的数据数值;
    赋值操作结束之后,变量和return的数据之间没有任何关系
    return 的是基本数据类型;
    
    
2. 如果函数的返回值是引用数据类型
   函数外部的变量中存储的是 引用数据类型的内存地址;
   相当于函数中有数据的内存地址正在被函数之外的变量存储使用;
   那么,函数的返回值是 : 引用数据类型(数组,对象,函数) ;
   所以,这个函数的执行空间就不会被销毁
   最后,return的是引用数据类型;