闭包详解-面试 必问,必问,必问!!!

138 阅读2分钟

闭包

函数内部的局部作用域变量 不能在函数外部直接调用
因为函数执行结束 执行空间就会被销毁 局部作用域变量也会被销毁释放
// 定义
    闭包就是生成一个 不会被销毁的执行空间 
    延长局部作用域变量的生存周期 
                
// 如何生成一个不会被销毁的执行空间
    函数return的是引用数据类型,
    函数外有变量存储 函数的执行结果返回值 
    函数的执行空间不会被销毁
    在函数外部 可以 操作函数内部的局部作用域变量
​
// 什么要用闭包 
    因为 JavaScript 存在 全局变量污染
    也就是 全局变量 非常容易被其他程序(函数等)误操作
​
    为了保证数据的安全 往往需要将全局变量设定成 函数的局部变量
​
    再通过闭包的语法 调用操作 最后变量数据
    
// 闭包的优缺点
(1) 优点 创建一个不会被销毁的存储空间                缺点 占用内存
(2) 优点 延长变量的生存周期                        缺点 容易造成数据泄露
(3) 优点 保护变量不会受到全局变量污染 数据更安全       缺点 调用使用比较麻烦
​
​
//闭包语法的基本总结
                1,  闭包语法的基本套路 
                    函数return函数
                    使用变量存储 调用变量 就是调用return的函数
                2,  实际项目中一般使用立即执行函数的语法形式
                    标签对象.addEventListener( 事件类型 , ( function(形参){                      
                        let 变量 = 形参                      
                        return function(){ 
                            console.log( 变量 )
                        };
                    } )( 实参i ) )
​
​
​
    // 函数a
    function a(){
        // 函数a的局部作用域变量
        let a = 100 ;
        let b = 200 ;
        // return 的是 函数b
        return function(){
            // 函数b中设定要对函数a局部变量的操作
            console.log( a+b ); 
        }
    }
    // 在函数a外部 使用变量存储函数a的执行结果返回值
    // 变量res中存储的是函数a return 的 匿名函数的内存地址
    const res = a() ; 
    // 调用变量res 就是 通过变量res中存储的内存地址
    // 调用 函数a return 的匿名函数 
    // 匿名函数的程序 就是我们想要操作 局部变量a 局部变量b 执行的程序
    res()