精通Javascript 之 作用域和闭包

JS里作用域是由函数划分的,而不是由块(while、if和for)划分。函数可以直接读取全局变量,但是外部无法直接访问函数内部的变量。
闭包的意思是内层的函数可以引用存在于包围它的函数内的变量,即使外层函数的执行已经终止。闭包之于JS是非常重要的概念。
假设说有这么一个例子:
function f1(){
     n=999;//声明了一个全局变量
   }
   f1();
   alert(n); // 999,外部使用到这个变量
 

假设我们真的需要完成这样一个功能,n这个全局变量的声明是不合适的,这是一个坏习惯,谁也不知道你在函数内部还声明了一个名为n的全局变量。所以我们需要把n藏起来
function f1(){
     var n=999;
     function f2(){
       alert(n);
     }
     return f2;
  }
   var result=f1();
   result(); //这个就是执行函数f2
 
这个方法通过创建一个f2这个函数把n变量读取到外部,并执行和第一段代码相同的功能。这个就是闭包最基础的用法,外部调用函数内部的变量。闭包还能使这个变量值始终保持在内存里,看下面这个应用:
function f1(){
     var n=999;
     nAdd=function(){n+=1}
     function f2(){
       alert(n);
     }
     return f2;
   }
   var result=f1();
   result(); // 999
   nAdd();
   result(); // 1000
为什么n的值始终保持在内存里呢?f1函数的执行结果f2在外部被赋予给一个全局变量,所以f2里面的内容不会被回收,n变量值一直被保存着。而nAdd呢是被定义的一个全局变量而且是个匿名函数,也相当于一个闭包可以对n进行操作。所以第二个result的执行结果是1000.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值