zoukankan      html  css  js  c++  java
  • 闭包 —JavaScript面向对象高级

    # 闭包 #

      我的理解:面试时,先说作用域链,再说闭包产生的原因,然后是垃圾回收GC,最后说闭包。

           a.一个函数内部声明的变量,就是它的私有变量.
           b.在javascript中特性中,函数是可以访问它所在作用域链的所有变量.
           c.但函数外部是不能直接访问函数内部的私有变量
           D.通过函数内部再嵌套函数,子函数返回父函数的变量,就创建了一个闭包。

    闭包的表现形式

      模块化的本质:是通过函数的局部作用域特性来产生局部上下文来保存局部变量 

      1.函数作为返回值

            function fn(){
              var count = 0;
              return function(){  //这句话是重点
                 count++;
                 console.log(count)
              }
           }

            var a = fn()
            a();  //1
            a();  //2
            a();  //3
            a();  //4    //a作为变量,是对fn()的引用,所以fn一直没被释放
            a = fn()     //对a重新赋值,重新把fn的引用给a 所以中间释放过
            a();  //1     

      2.函数当做参数传递
           
               var max = 10;
               var fn =function(x){
                  if(x>max){
                    console.log(x)
                  }
               }//max是自由变量,在fn定义好后就固定,所以max =10
               
               function fn1(f){
                var max = 100;
                f(15);
               }
            
               fn1(fn) //15


      3.信息暴露和隐藏
            
            function fn(){
             var a = 10;
             var  b = [1,2,3,4];
             var count = 0;
             function addCount(){
                 count++
             };
             function getCount(){
                return count;
             }
        
             return {
               add:addCount,
               get:getCount
             }
           //这里暴露出去的对象,只有两个方法,而私有变量a 和 b没有暴露,所以是保密的,可以选择性的暴露    ————模块化 seajs就是这样实现
           }
            var  a = fn(); //将引用给a

       4.异步回调
           
           
        // 闭包——异步回调
             function fn(){
                 var i = 0;
                 window.setInterval(function(){
                      console.log(i++)
                 },1000);
                 console.log('prevent')   
             }
             fn()
         
          注意:setInterval()是典型的异步,fn在执行后,打印出'prevent',然后应该fn调用完成被销毁,但是定时器依然在执行,所以fn依然还在。  
           

  • 相关阅读:
    Java加密与解密之非对称加密算法
    Java加密与解密之对称加密算法
    Java加密与解密之消息摘要算法
    基于Spring Cloud Zookeeper的服务注册与发现
    .NET 5.0正式发布,新功能特性(翻译)
    C# 9.0 中的新增功能
    C# 规范建议
    Flutter Weekly Issue 70
    Android 开发技术周报 Issue#298
    Flutter Weekly Issue 69
  • 原文地址:https://www.cnblogs.com/luowen075/p/6135869.html
Copyright © 2011-2022 走看看