js--闭包

  • 当在函数内部定义了其他函数时,就创建了闭包。

  • 在后台执行环境中,闭包的作用域链包含着它自己的作用域、外部函数的作用域和全局作用域。

  • 通常,函数的作用域及其所有变量都会在函数执行结束后被销毁。

  • 所以,创建并立即调用一个函数,既可以执行其中的代码,又不会在内存中留下对该函数的引用。

  • 但是,当函数返回一个闭包时,这个函数的作用域将会一直在内存中保存到闭包不存在为止。

  • 每个函数在被调用时都会自动取得两个特殊变量:this和arguments,内部函数在搜索这两个变量时,只会搜索到自己的活动对象为止,因此永远不可能直接访问外部函数的这两个变量,所以在闭包函数里的this,指向的是window对象。

  • 例如:
    var name = "The Window";

     var object = {
         name : "My Object",
     
         getNameFunc : function(){
             return function(){
                 return this.name;
             };
         }
     };
     
     alert(object.getNameFunc()());  //"The Window"
    
  • 清理内存:

  •      function assign(){
             var element = document.getElementById("xxx");
             var id = element.id;
             element.onclick = function(){
                 alert(id);
                 // alert(element.id);
             }
             element = null;
             }
    
  • 解析:DOM对象往往占据较大的内存,当在闭包函数内直接访问element.id时,element具有两个引用数,引用数大于0就无法被垃圾回收。

  • 改进:用id = element.id来取得需要的值,而避免在闭包内对element的整个引用,但此时element依然在外部函数的作用域中被引用,引用数为1依旧大于0,所以为了使element所指对象的引用数0,在使用完后要将element的引用指向null,这样之前被element引用的对象就可以被垃圾回收了。

你可能感兴趣的:(js--闭包)