对于闭包的理解

闭包

闭包的形成与变量的作用域以及变量的生存周期密切相关。下面我们先简单了解这两个知识点。

变量的作用域

在javascript中,函数内部的变量,在函数外部是访问不到的。

var func = function(){ 
 var a = 1; 
 alert ( a ); // 输出: 1 
}; 
func(); 
alert ( a ); // 输出:Uncaught ReferenceError: a is not defined 

变量的生存周期

对于全局变量来说,全局变量的生存周期当然是永久的,除非我们主动销毁这个全局变量。
而对于在函数内用 var 关键字声明的局部变量来说,当退出函数时,这些局部变量即失去了它们的价值,它们都会随着函数调用的结束而被销毁。

var func = function(){ 
 var a = 1; 
 return function(){ 
 a++; 
 alert ( a ); 
  } 
}; 
var f = func(); 
f(); // 输出:2 
f(); // 输出:3 
f(); // 输出:4 
f(); // 输出:5 

但是,在上述例子中,变量a并没有被销毁。原因就是f 返回了一个匿名函数的引用,它可以访问到 func()被调用时产生的环境,而局部变量 a 一直处在这个环境里。

于是,闭包的概念就形成了,既然局部变量所在的环境还能被外界访问,这个局部变量就有了不被销毁的理由。在这里产生了一个闭包结构,局部变量的生命看起来被延续了。

闭包与内存管理

使用闭包的一部分原因是我们选择主动把一些变量封闭在闭包中,因为可能在以后还需要使用这些变量,把这些变量放在闭包中和放在全局作用域,对内存方面的影响是一致的,这里并不能说成是内存泄露。如果在将来需要回收这些变量,我们可以手动把这些变量设为 null。

跟闭包和内存泄露有关系的地方是,使用闭包的同时比较容易形成循环引用,如果闭包的作用域链中保存着一些 DOM 节点,这时候就有可能造成内存泄露。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值