<!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=gb2312" />
<title>无标题文档</title>
<script type="text/javascript">
//1:什么是闭包? 函数嵌套函数,内部函数可以引用外部函数的参数和变量,参数和变量不会被垃圾回收机制收回。
function aaa(a)
{
var b=5
function bbb()
{
alert(a);
alert(b)
}
}
aaa(); //执行完毕后变量a,b不会被垃圾回收机制收回
//js中的垃圾回收机制
function ccc()
{
var a=1;
}
ccc();//执行完毕变量a被垃圾回收机制回收*/
function ddd()
{
var a=5;
function eee()
{
alert(a);
}
return eee;
}
var c=ddd();//执行完毕变量a未被垃圾回收机制回收
c(); //5 变量a还存在
//2:闭包的好处: a:希望一个变量长期驻扎在内存中, b:避免全局变量的污染,c:私有成员的存在。
var a=1;
function aaa()
{
i++;
alert(a);
}
aaa() //2
aaa() //3
alert(a) //因为a是全局变量所以还能找到
//提高性能避免全局变量
function aaa()
{
var a=1;
a++;
alert(a);
}
aaa(); //2
aaa(); //2 调用一次后被回收,所以依然是2
//a是局部变量,同时做到累加,闭包能做到。
function aaa()
{
var a=1;
return function()
{
a++;
alert(a);
}
}
var b=aaa();
b(); //2
b(); //3
alert(a) //报错,因为a是局部变量
//函数声明改为函数表达式,
function aaa() //函数声明
{
alert(1);
}
aaa();
( function aaa() //函数表达式
{
alert(1);
})(); //自执行
( 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(); //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); //2 点击每个都会弹出2,因为我点击时循环已经结束
}
//利用壁包改写
(function(i){
aLi[i].onclick=function()
{
alert(i)
}
})(i);
//另一种改写
aLi[i].onclick=(function(i){
return function()
{
alert(i);
}
})(i);
}
//3:IE下会引发内存泄漏
var oDiv=document.getElementById('div1');
oDiv.onclick=function() //因为onclick属性引用了function函数,
{
alert(oDiv.id); //而function内部的oDiv.id又引用了外部的oDiv对象,互相引用,所以会内存泄漏。
}
//解决方法一:
window.onunload=function()
{
oDiv.onclick=null;
}
//解决方法二:
var oDiv=document.getElementById('div1');
var id=oDiv.id;
oDiv.onclick=function()
{
alert(id);
}
oDiv=null;
}
</script>
</head>
<body>
<div id="div1"></div>
<ul>
<li>111</li>
<li>222</li>
<li>333</li>
</ul>
</body>
</html>