javascript 闭包的学习
闭包的学习
1.什么是闭包?
2.闭包有什么好处?应用在那里?
3.闭包需要注意得地方?
这是我学习javascript 闭包的方向:
闭包的定义:函数嵌套函数,内部函数可以引用外部函数的参数和变量,参数和变量不会被垃圾回收机制所收回,什么意思?好抽象哦
function a(){ // 先定义一个函数 var i=1; function b(){ alert(i); // 这里弹出的是1;没错就是1,这里正应证了函数嵌套函数,内部函数可以引用外部函数的参数和变量 } return b();
} a();//执行函数
这里我再说一下js垃圾回收机制
function aaa(){ var a = 1; a++; alert(a); } aaa(); //这里执行的时候弹出的2;
aaa();在执行一次的时候弹出的还是2; 为什么呢,哈哈,这里就涉及js 的垃圾回收机制,var a=1;是局部变量,没有被引用,一旦aaa()执行后会销毁 a变量;在执行时又
重新创建var a=1;所以两次都是弹出的是2;那怎样才不会销毁呢,想一直累加?
var a = 1;//定义一个全局变量 function aaa(){ a++; alert(a); } aaa(); // 弹出是2 aaa();//弹出的是3
这里的a 没有被销毁,a是一个全局变量,所以一直引用,这就是js的垃圾回收机制,可是我想在内部一直累加行不行呢
可以的。。。。。
function a(){ var a=1; function b(){ a++; alert(a); } return b; } var c=a(); c(); //2 c(); //3
//为什么会是3呢,这里就涉及js的垃圾回收机制
function b(){ a++; alert(a) } // 这里的a 一直引用着,并没有销毁a 变量,所以才会累加
好处:
1.希望一个变量长期驻扎在内存当中
2.避免全局变量的污染
3.私有成员的存在
用法:
1.模块化代码
2.在循环中直接找到对应元素的索引
var a = 1; function aaa(){ a++; alert(a); } aaa(); //2 aaa(); //3
function aaa(){ var a = 1; a++; alert(a); } aaa(); //2 aaa(); //2
alert(a); ===>a is not defined
function aaa(){ var a = 1; return function(){ a++; alert(a); } } var b = aaa(); b(); //2 b(); //3 alert(a); ===>a is not defined
var aaa = (function(){ var a = 1; return function(){ a++; alert(a); } })(); aaa(); //2 aaa(); //3
var aaa = function(){
var a = 1;
function bbb(){
a++;
alert(a);
}
function ccc(){ a++; alert(a); } return { b : bbb, c : ccc } }(); aaa.b(); //2 aaa.c(); //3
alert(a); // 这里访问不到的 ====>a is not defined alert(bbb);// 这里访问不到的 ====>bbb is not defined alert(ccc);//这里是访问不到的 ====>ccc is not defined
function aaa(){ alert(1); } aaa(); (function(){ alert(1); })();
这里怎样才点击的到li 的下标呢
<script> window.onload = function(){ var aLi = document.getElementsByTagName('li'); for(var i=0;i<aLi.length;i++){ (function(i){//这里是传递参数 aLi[i].onclick = function(){ alert(i); }; })(i);//这里的 i 作为参数传人
}
</script>
<script>
window.onload = function(){
var aLi = document.getElementsByTagName('li');
for(var i=0;i<aLi.length;i++){ aLi[i].onclick = (function(i){ return function(){ alert(i);
} })(i); }
};
</script>
<ul> <li>11111111111</li> <li>11111111111</li> <li>11111111111</li> </ul>
如有错误,请留言