代码改变世界

JS 闭包

2009-09-18 01:58  netwy  阅读(525)  评论(0编辑  收藏  举报

Js代码

  1. function outerFun()  
  2.     {  
  3. var a=0;  
  4. function innerFun()  
  5.         {  
  6.             a++;  
  7.             alert(a);  
  8.         }                 
  9.     }  
  10.     innerFun() 

上面的代码是错错误的.innerFun()的作用域在outerFun()内部,所在outerFun()外部调用它是错误的.

改成如下,也就是闭包:

Js代码

  1. function outerFun()  
  2. {  
  3. var a=0;  
  4. function innerFun()  
  5.     {  
  6.         a++;  
  7.         alert(a);  
  8.     }  
  9. return innerFun;  //注意这里
  10. }  
  11. var obj=outerFun();  
  12. obj();  //结果为1
  13. obj();  //结果为2
  14. var obj2=outerFun();  
  15. obj2();  //结果为1
  16. obj2();  //结果为2

什么是闭包:

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

再来看一个例子

Js代码

  1. function outerFun()  
  2.         {  
  3. var a =0;  
  4.             alert(a);         
  5.         }  
  6. var a=4;  
  7.         outerFun();  
  8.         alert(a); 

结果是 0,4 .  因为在函数内部使用了var关键字 维护a的作用域在outFun()内部.

再看下面的代码:

Js代码

  1. function outerFun()  
  2. {  
  3. //没有var 
  4.     a =0;  
  5.     alert(a);         
  6. }  
  7. var a=4;  
  8. outerFun();  
  9. alert(a); 

结果为 0,0 真是奇怪,为什么呢?

作用域链是描述一种路径的术语,沿着该路径可以确定变量的值 .当执行a=0时,因为没有使用var关键字,因此赋值操作会沿着作用域链到var a=4;  并改变其值.