<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script>
//闭包:函数嵌套函数,内部函数可以引用外部函数的参数和变量,参数和变量不会被垃圾回收机制所收回,
//闭包有什莫好处,应用在哪:
//好处:1):希望一个全局变量长期驻扎在内存中;
//2):避免全局变量被污染
//3):私有成员的存在
//用法:1):代码模块化,尽可能减少全局变量(可以提高性能),不但可将全局变量私有化,而且可以将全局函数私有化
//2):在循环当中可以直接找到对应元素的索引,而不需要加索引;
//闭包要注意什么:在IE下会引发内存泄漏:指的就是当你页面跳转的时候,你闭包内的变量和函数并不会被清理因此你的CPU就会无限累加,只有当关闭浏览器的时候这些垃圾才会被清理
//js中的垃圾回收机制:当一个函数被调用之后,(为了介绍内存)其局部变量会被回收;
// function aaa(){//一般闭包写法
// var a=5;//不会被垃圾回收机制回收,应为在bbb函数中一直在应用(相当于bbb函数的全局变量);
// function bbb(){
// alert(a);
// }
// return bbb;
// }
// var c=aaa();//在这里就相当于c=function bbb(){alert(a);}(aaa函数执行的结果)
// c();//调用c就相当于,bbb函数执行;
//
// var aaa=(function(){//函数表达式写法,(自执行函数)
// var a=1;
// return function bbb(){
// a++;
// alert(a);
// }
// })();//执行的结果就是将bbb的(全局变量a保留了下了);然后再调用aaa函数就相当于执行bbb函数,
// aaa();//2
//
// var aaa=(function(){
// var a=1;
// function bbb(){
// a++;alert(a);
// }
// function ccc(){
// a++;
// alert(a);
// }
// return {b:bbb,c:ccc};
// })();
// //a,aaa,bbb全是aaa私有成员,在外面调用不到;
// aaa.b();//2
// aaa.c();//3
//
window.onload=function(){
var aLi=document.getElementsByTagName('li');
// for(var i=0;i<aLi.length;i++){
// aLi[i].onclick=function(){
// alert(i);//在这里,每当点的时候循环都执行完了,因此每次弹得都是3,
// }//而一般在程序中都会给li添加一个index属性,利用this,
// }
//闭包的写法一
// for(var i=0;i<aLi.length;i++){
// (function(i){
// aLi[i].onclick=function(){
// alert(i);
// }
// })(i);//在这里利用闭包将i当作参数传进去,让i的值一直存在内存当中,当外部函数执行完不影响内部函数执行
// }
//闭包的写法二
for(var i=0;i<aLi.length;i++){
aLi[i].onclick=(function(i){
return function(){
alert(i);
}
})(i);
}
}
</script>
</head>
<body>
<ul>
<li>111111</li>
<li>222222</li>
<li>333333</li>
</ul>
</body>
</html>
JavaScript闭包
最新推荐文章于 2025-03-09 10:31:53 发布