闭包

作者: 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>

相关文章

  • swift-闭包

    闭包 闭包定义 闭包简化 - 尾随闭包 闭包参数 闭包返回值 闭包的循环引用

  • 闭包,闭包,闭包

    1、这家伙到底是什么? 网上关于这个的讨论的太多了太多了,有各种的举例子,但是大部分还在寻找这个答案的小伙伴对于变...

  • 闭包-Closures [swift 5.1]

    闭包的语法 尾随闭包 闭包逃离 自动闭包

  • Day7 闭包(Closures)

    本页包含内容:• 闭包表达式• 尾随闭包• 值捕获• 闭包是引用类型• 逃逸闭包• 自动闭包 1、闭包表达式 闭包...

  • Python闭包

    闭包 = 环境变量 + 函数 调用闭包内部的环境变量 闭包的经典误区 闭包与非闭包实现人类走路 非闭包 闭包

  • 闭包(closure)

    ● 闭包基础 ● 闭包作用 ● 闭包经典例子 ● 闭包应用 ● 闭包缺点 ● 参考资料 1、闭包基础 作用域和作...

  • swift- 闭包一

    /*• 闭包表达式• 尾随闭包• 值捕获• 闭包是引用类型• 逃逸闭包• 自动闭包*/

  • (9) python之闭包

    闭包闭包 = 函数 + 环境变量(函数定义的时候) 一个最简单的闭包 闭包不受外部变量影响 非闭包 闭包 闭包 只...

  • Swift-进阶 :闭包(二)逃逸闭包 & 非逃逸闭包

    本文主要分析逃逸闭包 、非逃逸闭包、自动闭包 逃逸闭包 & 非逃逸闭包 逃逸闭包定义 当闭包作为一个实际参数传递给...

  • javascript闭包详解

    跟我念 bi 闭 bao包 ,闭包的闭,闭包的包。。 闭包的简介 在计算机科学中,闭包(英语:Closure),又...

网友评论

      本文标题:闭包

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