zoukankan      html  css  js  c++  java
  • 闭包

    闭包的含义: 闭包就是一个函数,两个函数彼此嵌套,形成闭包条件是内部函数需要通过return给返回出来

        function f1(){
            var age =20;
            var height  =170;
            function f2(){
                console.log("年龄"+age +"身高"+height)
            }
            return f2;
        }
        var ff = f1(); //ff就是一个闭包,其和f2共同指引同一个function
        ff(); //年龄20身高170

    以上代码ff处于外部的全局环境,并且其调用的时候可以看到具体age和height内部输出

    闭包的特殊之处在于,age和height是f1的内部环境变量,其在外部环境被访问出来

    f1函数在执行完毕后,内部的信息要被销毁,age,height,f2均被销毁,f2被销毁后,垃圾回收机制要收走function,但是ff又去指引fai该函数,这样function内部的age和height也就依然存在,并且他们和外部的变量没有关系,因为他们已经固化为本身AO的成员信息,这样就会导致ff()执行的时候会有age和height信息输出

    闭包的特点:闭包有权利调用其上级环境的变量信息

    闭包使用规则:

    同一个闭包机制可以创建多个闭包函数出来,他们彼此没有联系,都是独立的,并且每个闭包都可以保存自己个性化信息。

         function f1(n){
             function f2(){
                 console.log(n)
             }
             return f2;
         }
         var fa =f1(100);
         var fb =f1(120);
         var fc =f1(150);
        fa();  //100
        fb();  //120
        fc();  //150

    闭包的应用场景:

    1,实现数组的循环输出

      var  arr = new Array();
        for(var i =0;i<4;i++){
            arr[i] =function(){
              console.log(i)
            }
        }
        arr[2]();//4
        arr[0]();//4
        arr[1]();//4
        arr[3]();//4

    循环以后生成的结果都是4,因为i是全局变量,所以都是在循环结束以后执行的函数,返回的结果都是4。要实现数组的循环输出,可以使用闭包实现

     var  arr = new Array();
    
         for(var  i=0;i<4;i++){
             arr[i] = f1(i);
         }
         function f1(n){
             function f2(){
                 console.log(n)
             }
             return f2
         }
         arr[2]();//2
         arr[0]();//0
         arr[1]();//1
         arr[3]();//3

    引用2 : 设置事件

    <script>
        window.onload = function(){
            var cars = document.getElementsByTagName('li');
            for(var i=0;i<3;i++){
                cars[i].onmouseover = function(){
                    cars[i].style.backgroundColor = "grey"
                }
            }
        }
    
    </script>
    <h2></h2>
    <ul>
        <li>奔驰</li>
        <li>宝马</li>
        <li>奥迪</li>
    </ul>

    上面代码会报错,使用闭包

    <script>
        window.onload = function(){
          var cars = document.getElementsByTagName('li');
            //可以利用闭包给每个元素设置独立的函数处理
            //并且函数内部也有独特的下标信息供访问
            for(var i=0;i<3;i++){
            //over和out分别是闭包机制,for循环会使得他们被分别执行3次
            //这样会在内存中生成3个函数,每个函数内部有自己可以访问的独特信息
                cars[i].onmouseover = over(i);
                cars[i].onmouseout = out(i);
            }
            //闭包
            function over(n){
                function f2(){
                    cars[n].style.backgroundColor ="pink"
                }
                return f2;
            }
            function out(n){
                function f2(){
                    cars[n].style.backgroundColor =""
                }
                return f2
            }
        }
    
    </script>
    <h2></h2>
    <ul>
        <li>奔驰</li>
        <li>宝马</li>
        <li>奥迪</li>
    </ul>

     

  • 相关阅读:
    使用 star UML制作的图
    评价片段
    项目部分
    用新学的知识 写了一段小代码
    常用系统存储过程
    考试小总结
    分页
    行转列面试题 事例
    子查询
    生成验证码的方法集合(一)
  • 原文地址:https://www.cnblogs.com/lrgupup/p/10180251.html
Copyright © 2011-2022 走看看