什么是闭包

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;  并改变其值.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值