<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<script>
//闭包 \
//函数嵌套函数
//内部函数可以引用外部函数和变量
//参数和变量不会被垃圾回收机制回收.因为bbb还在调用 var b=5;
/*
function aaa(a){
var b=5;
function bbb(){
alert(a);
alert(b);
}
}
*/
//垃圾回收机制
/*function aaa(){
var a=1;
}*/
//当我调用完aaa. var a=1;被垃圾回收机制回收
/*aaa();*/
/*
function aaa(){
var a=5;
function bbb(){
alert(a);
}
return bbb;
}
// aaa();已经执行完毕了.c代表bbb();
var c=aaa();
c();
*/
//闭包的好处. 1.希望一个变量长期驻扎在内存当中 2.避免全局变量的污染
/*
* 全局变量污染
* 模块化代码
* 私有化代码
* 在循环中直接找到索引
var a=1;
function aaa(){
a++;
alert(a);
}
aaa(); //2
aaa(); //3
*/
//垃圾回收机制,
/*
function aaa(){
var a=1;
a++;
alert(a);
}
/调用后销毁var a;
aaa();//2
aaa();//2
* */
/*
//闭包 --局部变量不污染
function aaa(){
var a=1;
return function(){
a++;
alert(a);
}
}
var b = aaa();
b(); //2
b(); //3
*/
/*
//函数声明
function aaa(){
alert(1);
}
aaa();
//函数表达式
(function(){
alert(1);
})();
*/
//可以修改闭包写法。 --模块化代码。 减少全局污染
/*
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();
aaa.c();
*/
window.onload = function() {
var aLi = document.getElementsByTagName('li');
//点击的时候循环已经结束。 所以点谁都是3
for(var i = 0; i < aLi.length; i++) {
aLi[i].onclick = function() {
alert(i);
}
}
}
//闭包改写
window.onload = function() {
var aLi = document.getElementsByTagName('li');
//点击的时候循环已经结束。 所以点谁都是3
// for(var i = 0; i < aLi.length; i++) {
// (function(i) {
// aLi[i].onclick = function() {
// alert(i);
// }
// })(i);
//
// }
//return 返回值写法
// for(var i = 0; i < aLi.length; i++) {
//
// aLi[i].onclick = function(i) {
// return function(){
// alert(i)
// }
// }(i);
//
// }
// }
/*会引发ie内存泄漏*/
</script>
</head>
<body>
<ul>
<li>1111111111</li>
<li>1111111111</li>
<li>1111111111</li>
</ul>
</body>
</html>