javascript 垃圾回收机制 小结

  • 局部变量在函数返回以后,并不一定会被立即回收,而是会等待不再被引用的时候,才会被回收!下面局部变量i在函数test返回以后,仍然存在,因为有m一直引用着该数组。但一旦手动将 m = null,该数组将因为无引用被自动回收。

[javascript]  view plain  copy
 print ?
  1. function test(){  
  2.   var i = [1,2];  
  3.   return i;  
  4. }  
  5. var m = test();  
  6. alert(m);//1,2  

 


  • 结合闭包:

[c-sharp]  view plain  copy
 print ?
  1. //代码引用自网络资源  
  2. function outerFunc(){  
  3.   var privateAttr = 10;  
  4.   function innerFunc(){  
  5.     privateAttr *= 2;  
  6.     return privateAttr;  
  7.   }  
  8.   return innerFunc;  
  9. }  
  10.   // 通过调用outerFunc函数,返回一个指向innerFunc函数的引用,  
  11.   // 这个引用被赋给变量refInnerFunc  
  12. var refInnerFunc = outerFunc();  
  13.   // 通过 refInnerFunc 这个引用调用到 innerFunc 函数  
  14. refInnerFunc(); // return 20 变量privateAttr可被innerFunc访问并修改  
  15. refInnerFunc(); // return 40  
  16.   // 调用outerFunc函数,创建了一个新的innerFunc函数的副本  
  17. var refInnerFunc2 = outerFunc();  
  18. refInnerFunc(); // return 20 不同副本中变量privateAttr的值是独立的。  

  • js的垃圾回收机制同样是对不再被其他对象引用的变量或方法进行回收,引用不仅可指向变量,也可指向函数,
  • 在上述js代码中,只要指向函数 innerFunc 的引用 refInnerFunc 还没有被设为null,那么处在函数 innerFunc 作用域内的局部变量都不会被js垃圾回收器回收。
  • 局部变量 privateAttr 被认为处在一个安全且相对封闭的“闭包”环境中,访问它的唯一方法是通过调用处在同一作用域下的 innerFunc 函数来进行。直到 innerFunc 函数不再被其他对象引用,其作用域内的变量和函数才能被释放回收。


  • 其他:
  1. JavaScript包含一个垃圾回收的小程序,这个程序能够周期性的遍历JavaScript环境中的所有变量的列表,并且给这些变量所引用的值做个标记。
  2. 如果被引用的值是对象或数组,那么对象的属性或者数组的元素就会被递归地做个标记。通过递归遍历所有值的树或者图,垃圾回收器就能够找到(并标记)仍旧使用的每个值。那些没有标记的值就是无用的存储单元。
  3. 当给所有正在使用的变量做完标记之后,垃圾回收器就会开始进行清除。在这个阶段中,它将遍历环境中所有值的列表,同时释放那些没有标记的值。
  4. 所以,关键问题是看,当前对该变量的引用计数为多少,如果有任何引用,那即使是临时变量也不会被立即回收的。闭包是借用了这一点。

思考:

  • 在做Javascript的对象内模拟C++中的私有成员变量的时候,也可以通过这种机制。(临时变量无法在外部访问,但因为有函数在引用着,因此可以被成员函数访问)。Nice~
  • 那是不是可以在对象内定义局部函数,甚至是匿名函数,然后在成员函数中引用形成闭包,这样也可以形成私有函数的访问。不过从功能上看就没有那个必要了吧~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值