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

 要理解闭包,首先要理解变量作用域,变量的作用域就两种,全局变量和局部变量,函数内部可以直接读取全局变量,函数外部无法读取函数内部的局部变量。
闭包定义:能读取函数内部局部变量的函数就是闭包,而只有函数内部的子函数才能读取局部变量,所以本质上,闭包就是将函数内部和函数外部链接起来的一栋桥梁。
闭包作用:一个是可以读取函数内部的局部变量,一个是让这些变量的值始终保存在内存中。
注意事项: 1)由于闭包会使函数中的变量保存在内存中,内存消耗很大,所以不能滥用。解决办法是在退出函数之前,将不使用的局部变量全部删除。
      2)闭包会在父函数的外部,改变父函数变量的值。所以,如果你把父函数当对象使用,把闭包当做它的公用方法,把内部变量当做它的私有属性。这时不能随便修改父函数内部变量的值。

1
<!DOCTYPE html> 2 <html> 3 <head> 4 <title></title> 5 <script type="text/javascript"> 6 /*闭包*/ 7 8 //返回了一个包含两个方法的对象,并且这两个方法继续享有访问value的权限 9 var myObject=function () { 10 var value=0; 11 return{ 12 increment:function(inc){ 13 value+=typeof inc==='number'?inc :1; 14 }, 15 getValue:function(){ 16 return value; 17 } 18 }; 19 }(); 20 21 //函数无需用new来使用,返回一个包含get_status方法的新对象。此函数可以访问它被创建时的上下文环境。这成为闭包。 22 var quo=function(status){ 23 return { 24 get_status:function(){ 25 return status; 26 } 27 } 28 }; 29 var myquo=quo("amazed"); 30 document.writeln(myquo.get_status()); 31 32 //定义一个函数,它设置一个DOM节点为黄色,然后把它渐变为白色 33 var fade=function(node){ 34 var level=1; 35 var step=function(){ 36 var hex=level.toString(16); 37 node.style.backgroundColor='#FFFF'+hex+hex; 38 if(level<15){ 39 level+=1; 40 setTimeout(step,100); 41 } 42 }; 43 setTimeout(step,100); 44 }; 45 fade(document.body); 46 /*****************实例******************************************/ 47 var add_the_handlers=function(nodes){ 48 var i; 49 for(i=0;i<nodes.length;i+=1){ 50 nodes[i].onclick=function(e){ 51 alert(i); 52 }; 53 } 54 }; 55 var add_the_handlers1=function(nodes){ 56 var i; 57 for(i=0;i<nodes.length;i+=1){ 58 nodes[i].onclick=function(i){ 59 return function(e){ 60 alert(e); 61 }; 62 }(i); 63 } 64 }; 65 var nodes1=document.getElementsByTagName("button"); 66 add_the_handlers1(nodes1); 67 </script> 68 </head> 69 <body> 70 <button>1</button> 71 <button>2</button> 72 <button>3</button> 73 <button>4</button> 74 <button>5</button> 75 </body> 76 </html>

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

原文地址:https://www.cnblogs.com/lvyongbo/p/4686737.html