js闭包

闭包的概念一直很模糊,闭包究竟是什么呢?

//函数嵌套函数,内部函数可以引用外部函数的参数变量,参数和变量不会被垃圾回收机制收回,因为内部函数bbb()引用aaa()的变量

function aaa(a){

   var b = 5;

   function bbb(){

         alert(a);

         alert(b)

}



}



aaa();

//js中的垃圾回收机制



function aaa(){



   var a = 1;



}

  aaa();
//简单的闭包例子。判定a没有被垃圾回收机制收回

function aaa(){

    var a = 5;

    function bbb(){

        alert(a)

  }
//定义一个全局变量a,实现累加功能



var a = 1;

function aaa(){

     a++;

     alert(a);

     

}

alert(a);   //2

alert(a);   //3









//定义一个私有变量a,不能实现累加



function aaa(){

    var a = 1;

    a++;

    alert(a)

}

alert(a);//2

alert(a);//2











//闭包的好处,即使a不是全局变量也能实现累加



function aaa(){

    var a = 1;

    return function(){

         a++;

         alert(a)

  }

}

var c = aaa();

c();//2

c();//3

alert(a)//报错找不到







//函数声明和函数调用

function aaa(){

  alert(a)

}

aaa();



//函数表达式

(function aaa(){

alert(1)

})()











//改写闭包,模块化代码,减小全局变量的污染



var aaa = (function(){

  var a = 1;

return function(){

  a++;

  alert(a)

}

})()



aaa()//2

aaa()//3





//私有成员的存在

var aaa = (function(){

   var a = 1;//局部变量

   //bbb(),ccc()私有方法

   function bbb(){

      a++;

      alert(a)

  }

   function ccc(){

     a++;

     alert(a);

  }

  return {

    b:bbb,

    c:ccc

}

})();

aaa.b();//2

aaa.c();//3

alert(a);//报错

alert(bbb);//报错

alert(ccc);//报错
 
   
//在循环中找到对应元素的索引

<script>

  var aLi = document.getElementByTagName('li');

//方法1

  for(var i = 0 ; i<aLi.lenght; i++){

       (function(i){

           aLi[i].onClick = function(){

            alert(i);

    }

       })(i)

  }



//方法2

for(var i = 0 ; i<aLi.lenght; i++){

           aLi[i].onClick = (function(i){

            return function(){

                alert(i);

       }

    })(i)

  }

   

  

</script>



<body>

<ul>

<li>111111</li>

<li>111111</li>

<li>111111</li>

</ul>

</body>

 

return bbb;

} 



var c=aaa();

c()
<script>

//IE下引发内存泄露

var oDiv = docudment.getElementById('div1');

oDiv.onClick = function(){

  oDiv.onClick = function(){

    alert(oDiv.id);

 };

//解决方法一

  window.onunload =  function(){

     oDiv.onClick = null;

  }

}

</script>

<script>

//IE下引发内存泄露

var oDiv = docudment.getElementById('div1');

oDiv.onClick = function(){

var oDiv = oDiv.id;

  oDiv.onClick = function(){

    alert(oDiv);

 };

//解决方法二

   oDiv = null;

}

</script>

<body>

<div id="div1">aaa</div>

</body>

闭包的讲解视频,在网上找到的讲的很好:http://v.youku.com/v_show/id_XNzkwNzM4NTc2.html

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