码迷,mamicode.com
首页 > Web开发 > 详细

js闭包和垃圾收集机制

时间:2018-11-03 18:22:14      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:ber   details   line   tail   htm   一段   函数   www.   comm   

 

1、JS的回收机制

JavaScript垃圾回收的机制很简单:找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是实时的,因为其开销比较大,所以垃圾回收系统(GC)会按照固定的时间间隔,周期性的执行。

到底哪个变量是没有用的?所以垃圾收集器必须跟踪到底哪个变量没用,对于不再有用的变量打上标记,以备将来收回其内存。用于标记的无用变量的策略可能因实现而有所区别,通常情况下有两种实现方式:标记清除和引用计数。引用计数不太常用,标记清除较为常用。

 

  准确来说,闭包是基于正常的垃圾回收处理机制下的。也就是说,一般情况一个函数(函数作用域)执行完毕,里面声明的变量会全部释放,被垃圾回收器回收。但闭包利用一个技巧,让作用域里面的变量,在函数执行完之后依旧保存没有被垃圾回收处理掉。

  可以文字你不太喜欢看,那好,我直接上代码。这可能是很多解说闭包的案列,先拿来用再说

  function foo(x) {

    var tmp = 3;
    return function (y) {
        alert(x + y + (++tmp));
    }
  }
  var bar = foo(2); // bar 现在是一个闭包
  bar(10);

 我们来分析一下这一段代码,在foo中,声明一个变量tmp,他属于foo作用域下的变量。函数返回一个函数,这个函数被嵌套,函数内部弹出x+y(++tmp)。这是个人都看得懂啊,那为什么会出现闭包,怎么出现的了。这接下来就是看执行的过程了,首先执行var bar = foo(2);那么foo就执行了,参数2也传进去了,但是执行完毕之后,tmp变量以及参数x就已经被释放回收了吗?并没有,因为返回值里面还等待使用这些变量咯,所以此时,foo虽然执行了,但是foo的变量并没有被释放,在return在等待继续使用这些变量了,这个时候bar就是一个闭包。

 

https://www.cnblogs.com/JIANGCHEN520/p/7118656.html

 

https://blog.csdn.net/michael8512/article/details/77888000

js闭包和垃圾收集机制

标签:ber   details   line   tail   htm   一段   函数   www.   comm   

原文地址:https://www.cnblogs.com/geekjsp/p/9901452.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!