<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>闭包初次接触</title> <script type="text/javascript"> var n=999; function f(){ alert(n); } f(); function f2(){ var m=999; //一定要使用var命令。如果不用的话,你实际上声明了一个全局变量! } //m is not defined //alert(m); //此处:外部是获取不到函数内部的局部变量的 function f22(){ k=777; //没有用var,则是全局变量 } f22(); alert(k); //那么怎么获取到函数内部的局部变量呢?----闭包 //闭包:定义在一个函数内部的函数,就是能够读取其他函数内部变量的函数。 function f3(){ var p=888; function f4(){ alert(p); } return f4;// } var result=f3(); result(); //闭包可以用在许多地方。它的最大用处有两个, //一个是前面提到的可以读取函数内部的变量 //另一个就是让这些变量的值始终保持在内存中。 </script> </head> <body> </body> </html>
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>匿名函数和闭包</title> <script type="text/javascript"> //另一个就是让这些变量的值始终保持在内存中。 function f(){ var n=999; nAdd=function(){n+=1;}//匿名函数,本身就是个闭包,没有var,是个全局变量 function f2(){ alert(n); } return f2; } var result=f(); //返回局部变量n的值 result(); nAdd(); //n+1后返回1000,说明n一直在内存中 result(); </script> </head> <body> </body> </html>
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>闭包使用</title> <script type="text/javascript"> var name="The Window"; var object={ name:"My Object", getNameFunc:function(){ return function(){ return this.name; } } } alert(object.name); alert(object.getNameFunc()()); </script> </head> <body> </body> </html>
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>闭包使用</title> <script type="text/javascript"> function outerFun(){ var a=0; function innerFun(){ a++; alert(a); } return innerFun; } var obj=outerFun(); obj(); obj(); var obj2=outerFun(); obj2(); obj2(); </script> </head> <body> </body> </html>
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>闭包使用</title> <script type="text/javascript"> function outerFun(){ var a=0; alert(a); } var a=4; outerFun(); alert(a);//结果是 0,4 . 因为在函数内部使用了var关键字 维护a的作用域在outFun()内部. function outerFun2(){ a=0;//没有var alert(a); } var a=4; outerFun2(); alert(a);//结果为 0,0 真是奇怪,为什么呢? //作用域链是描述一种路径的术语,沿着该路径可以确定变量的值 . //当执行a=0时,因为没有使用var关键字, //因此赋值操作会沿着作用域链到var a=4; 并改变其值. </script> </head> <body> </body> </html>