• 闭包 —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依然还在。  
           

  • 相关阅读:
    引用类型构造器
    正则指引量词
    Ajax的XMLHttpRequest对象
    正则指引字符组
    方法可变数量的参数
    不使用XMLHttpRequest实现异步加载:Iframe和script
    可选参数、命名参数
    常量和字段
    正则指引括号
    值类型实例构造器
  • 原文地址:https://www.cnblogs.com/luowen075/p/6135869.html
Copyright © 2020-2023  润新知