美高梅网投网站-美高梅手机网投-美高梅官方网站
做最好的网站

您的位置:美高梅网投网址 > 美高梅手机网投 > 收缩全局变量的传染 如上,下边开始自己有关闭

收缩全局变量的传染 如上,下边开始自己有关闭

发布时间:2019-09-27 00:12编辑:美高梅手机网投浏览(87)

    闭包一直是JS中比较难于理解的部分,也是面试中经常遇到的问题,下面开始我关于闭包的理解,希望能帮助你理解闭包

    关于闭包

    在JS中闭包是一个比较重要的概念.个人理解就是函数中嵌套函数,内部函数可以访问外部函数的变量,也可以在内部函数把外部函数的变量暴露出去,外面可以访问到.
    缺点:内存没有被释放,活动对象没有被销毁,占用内存

    闭包和作用域链和垃圾回收挂钩
    每个函数都有它自己的作用域链,可以保证对当前执行环境有权访问的所有变量和方法有序访问,保证私有变量不能被访问。内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数。每个环境都可以向上搜索作用域链,但任何环境都不能向下搜索作用域链而进入另一个执行环境

    垃圾回收:
    1:如果JS对象不在被引用,那么对象就会被回收
    2:如果两个对象相互引用,而不在被第三个引用,那么两个相互引用的对象也会被回收.

       var n = 999;
       function f1(){
         return n
       }
       f1()
    }
    f()
    var b = f()
    释放
    b = undefined;
    

    闭包的三个特性:
    1:函数嵌套函数
    2:函数内部可以引用函数外部的变量和方法
    3:可以保存外部变量的值不被垃圾回收

    闭包的好处
    1:长期保存一个变量
    2:避免全局污染
    3:私有成员的存在

    闭包的坏处
    1:内存没有及时释放,占用内存。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
    2:闭包会在父函数外部,改变父函数内部变量的值。在使用时要注意.个人理解就是内存占用如果在方法里面总是++,就会失去变量值的控制。见局部变量的累加

    1.什么是闭包?

    案例

    //保存私有变量 也可以用来定义常量
    var peoson = function(){
      var age = 24; //不是放的this.age 就算是new person也得不到age 只能通过getAge得到
      this.getAge = funciton(){
        return this.age;
      }
    }
    
      //穿的i是地址的引用,值早已改变
      var aLi = document.getElementsByTagName('li'); //加入ali的长度为4
       for (var i = 0; i < aLi.length; i++) {
         aLi[i].onclick = function () {        //当点击时for循环已经结束 
            alert(i);   //所有输出都为4
         }; 
       }
    
       //长期保存一个变量
       //传的i一直在被引用 没被回收,等绑定事件执行完 才被回收重新赋值
       var aLi = document.getElementsByTagName('li'); //加入ali的长度为4
       for (var i = 0; i < aLi.length; i++) {
         (function(i){
           aLi[i].onclick = function () {        //对应的i已经被保存
              alert(i);   //输出对应的i
           })(i); 
       }
    

      我对于闭包的定义:内部函数被外部函数之外的变量引用的时候就形成了闭包。

    局部变量的累加
    function add(){
      var n = 1;
      return function(){
        ///this.n;注意this指向window 记住 this 看谁调用它 就执向谁,如果前面没有,那就window
        i++;
        alert(i)
      }
    }
    add(); //2
    add(); //3
    

    2.闭包有什么用?

    模块化代码,减少全局变量的污染 如上

      1)闭包能允许外部环境引用内部变量,内部变量是私有化变量,在防止全局污染的时候又长久的保留了局部变量(当然闭包不释放就会造成内存的使用,我们可以使用null释放内存)

     1   2             function grandF(){ 3                 var name ="son"; 4                 function parent(){ 5                     return name; 6                 }         7                 return parent; 8             } 9             var lala =  grandF;10             console.log;//son11             lala = null;12             console.log;//null 销毁闭包,释放内存
    

       2)闭包实现缓存

       3) 封装

     var person = function(){                   var name ="yang";                   return {                        getName:function(){                       return name;                   },                   setName:function{                        name =newName;                    }                   }           }();           console.log(person.name);//undefined           console.log(person.getName;//yang           person.setName("hao");           console.log(person.getName//hao
    

       4)实现类和继承

    function Person(){        var name = "default";                  return {           getName : function(){               return name;           },           setName : function{               name = newName;           }        }        };       var p = new Person();    p.setName("Tom");    alert(p.getName;    var Jack = function(){};    //继承自Person    Jack.prototype = new Person();    //添加私有方法    Jack.prototype.Say = function(){        alert("Hello,my name is Jack");    };    var j = new Jack();    j.setName("Jack");    j.Say();    alert(j.getName;
    

    3.什么时候使用闭包?

      变量想要重复使用,并且不想污染全局环境的时候

    4.闭包的缺点?

      占用更多内存,不容易被释放。

      在 Javascript 中,如果一个对象不再被引用,那么这个对象就会被 GC 回收,否则这个对象一直会保存在内存中,在第一个闭包的例子中parent定义在grandF中,parent依赖于grandF,而外部变量lala引用了parent,所以grandF间接被引用,所以不会被自动回收

    5.闭包的高级写法

    (function  {    var viewport;    var obj = {        init: function {           viewport = document.querySelector('#' + id);        },        addChild: function {            viewport.appendChild;        },        removeChild: function {            viewport.removeChild;        }    }    window.jView = obj;});
    

    6.总结:这是对闭包最简单的理解,当然闭包还有其更深层次的理解,这个就涉及的多了,你需要了解JS的执行环境(execution context)、活动对象(activation object)以及作用域和作用域链(scope chain)的运行机制

    本文由美高梅网投网址发布于美高梅手机网投,转载请注明出处:收缩全局变量的传染 如上,下边开始自己有关闭

    关键词:

上一篇:【美高梅网投网站】参谋地址,布满排序

下一篇:没有了