怎么说,闭包大体也就是作用域的问题。
闭包的一个用途是用于模块化,保护函数体内的私有变量,如:
1 var foo = function(){ 2 var _num = 1; 3 var sayHello = function(){ 4 console.log('hello'); 5 }; 6 var getNum = function(){ 7 return _num; 8 }; 9 return { 10 getNum : getNum , 11 sayHello : sayHello 12 } 13 } 14 var num = foo().getNum(); 15 console.log(num); //1 16 foo().sayHello(); //hello
模块化的东西不多说,下面说之前一直不解的问题:
1 var $div = $("div"); 2 for(var i = 0; i < $div.length;i++){ //length = 4 3 $div[i].onclick = function(){ 4 console.log(i); // 4 4 4 4 (模拟按次序点击,触发) 5 } 6 }
原因在于log的参数i为形参,只有在onclick事件触发时,才将i赋值。
简单修改,通过立即执行函数即可将i进行绑定:
1 var $div = $("div"); 2 for(var i = 0; i < $div.length;i++){ //length = 4 3 $div[i].onclick = (function(i){ 4 console.log(i); // 1 2 3 4 (for循环自行触发) 5 }(i)); 6 }