《JS语言精粹》学习笔记 函数部分の闭包

时间:2023-12-24 17:10:55
 要理解闭包,首先要理解变量作用域,变量的作用域就两种,全局变量和局部变量,函数内部可以直接读取全局变量,函数外部无法读取函数内部的局部变量。
闭包定义:能读取函数内部局部变量的函数就是闭包,而只有函数内部的子函数才能读取局部变量,所以本质上,闭包就是将函数内部和函数外部链接起来的一栋桥梁。
闭包作用:一个是可以读取函数内部的局部变量,一个是让这些变量的值始终保存在内存中。
注意事项: 1)由于闭包会使函数中的变量保存在内存中,内存消耗很大,所以不能滥用。解决办法是在退出函数之前,将不使用的局部变量全部删除。
      2)闭包会在父函数的外部,改变父函数变量的值。所以,如果你把父函数当对象使用,把闭包当做它的公用方法,把内部变量当做它的私有属性。这时不能随便修改父函数内部变量的值。 1 <!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript">
/*闭包*/ //返回了一个包含两个方法的对象,并且这两个方法继续享有访问value的权限
var myObject=function () {
var value=0;
return{
increment:function(inc){
value+=typeof inc==='number'?inc :1;
},
getValue:function(){
return value;
}
};
}(); //函数无需用new来使用,返回一个包含get_status方法的新对象。此函数可以访问它被创建时的上下文环境。这成为闭包。
var quo=function(status){
return {
get_status:function(){
return status;
}
}
};
var myquo=quo("amazed");
document.writeln(myquo.get_status()); //定义一个函数,它设置一个DOM节点为黄色,然后把它渐变为白色
var fade=function(node){
var level=1;
var step=function(){
var hex=level.toString(16);
node.style.backgroundColor='#FFFF'+hex+hex;
if(level<15){
level+=1;
setTimeout(step,100);
}
};
setTimeout(step,100);
};
fade(document.body);
/*****************实例******************************************/
var add_the_handlers=function(nodes){
var i;
for(i=0;i<nodes.length;i+=1){
nodes[i].onclick=function(e){
alert(i);
};
}
};
var add_the_handlers1=function(nodes){
var i;
for(i=0;i<nodes.length;i+=1){
nodes[i].onclick=function(i){
return function(e){
alert(e);
};
}(i);
}
};
var nodes1=document.getElementsByTagName("button");
add_the_handlers1(nodes1);
</script>
</head>
<body>
<button>1</button>
<button>2</button>
<button>3</button>
<button>4</button>
<button>5</button>
</body>
</html>

什么是闭包:当函数在定义它的作用域的外部被引用时,就创建了该内部函数的闭包,如果内部函数引用了位于外部函数的变量,当外部函数调用完毕后,这些变量在内存不会被释放,因为闭包需要它们。