闭包

作者: autumn_3d55 | 来源:发表于2021-09-17 21:18 被阅读0次

    1.闭包理解

    1.如何产生闭包

    当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时,就产生了闭包。

    2.闭包到底是什么

    • 理解一:

    闭包是嵌套的内部函数(绝大多数人)。

    • 理解二:

    包含被引用变量(函数)的对象(极少数人)。

    3.产生闭包的条件

    函数嵌套

    内部函数引用了外部函数的数据(变量/函数)。

    执行函数定义就会产生闭包。

    4.常见的闭包

    • 1.将函数作为另一个函数的返回值。
    function fn1(){
          var a=1;
          function fn2(){
            a++;
            console.log(a);
          }
          return fn2;
        }
        let f = fn1();
        f();//2
        f();//3
    
    • 2.将函数作为实参传递给另一个函数调用。
    function showDelay(msg,time){
          setTimeout(function(){
            alert(msg); //只有msg被引用了
          },time);
        }
        showDelay('zs',1000);
    

    5.闭包的生命周期

    ==函数执行完后,函数内部声明的局部变量是否还存在?== 一般是不存在,但存在于闭包中的变量才可能存在

    ==在函数外部能直接访问函数内部的局部变量吗?==

    不能,但我们可以通过闭包操作函数内部的变量

    产生:在嵌套的内部函数定义执行完成时就产生了 死亡:在嵌套的内部函数成为垃圾对象时

    function f1(){
            //此时就已经产生闭包(因为函数提升)
           var b=2;
           function fn(){
               b++;
               console.log(b);
           }
           return fn;
        };
        var f=f1();
        f();
        f=null//闭包消失,因为内部函数成为了垃圾对象(没有变量在引用它)
    
    

    6.闭包的应用

    • 循环遍历加监听
    • 模块化: 封装一些数据以及操作数据的函数, 向外暴露一些行为
    • JS框架(jQuery)大量使用了闭包
    <script type="text/javascript">
            var btns = document.getElementsByTagName('button')
    
            //利用闭包
            for (var i = 0, length = btns.length; i < length; i++) {
                (function(j) {
                    var btn = btns[j]
                    btn.onclick = function() {
                        alert('第' + (j + 1) + '个')
                    }
                })(i)
            }
        </script>
    

    2.闭包的优缺点

    1.优点

    ①保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突

    ②在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存)

    ③匿名自执行函数可以减少内存消耗

    2.缺点

    ①其中一点上面已经有体现了,就是被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null;

    ②其次由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响.

    3.闭包的缺点及解决方案

    • 变量占用内存的时间可能会过长

    • 可能导致内存泄露 【白白占用内存】

    • 解决:

      • 及时释放 : f = null; //让内部函数对象成为垃圾对象
    
    <script type="text/javascript">
            function fn1() {
                var arr = new Array[100000]
    
                function fn2() {
                    console.log(arr.length)
                }
                return fn2
            }
            var f = fn1()
            f()
    
            f = null // 让内部函数成为垃圾对象-->回收闭包
        </script>
    

    相关文章

      网友评论

          本文标题:闭包

          本文链接:https://www.haomeiwen.com/subject/gxpsgltx.html