js闭包和垃圾收集机制

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

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

时间: 2024-11-05 16:00:34

js闭包和垃圾收集机制的相关文章

js闭包和缓存机制

/*1.js缓存机制保存共用数据提高性能*/ var cache={}; var mult=function(){ var args=Array.prototype.join.call(arguments,","); if(cache[args]){ //这里第一次alert调mult时还不走这里,现在上面的cache还没存到数据,因为还没有到return返回数据,直到第二次alert他才会走这里面 //如果发现cache里有这些数据就直接返回这些数据,不去接下走了 return ca

关于js闭包是否真的会造成内存泄漏(转载)

闭包是一个非常强大的特性,但人们对其也有诸多无解.一种危言耸听的说法是闭包会造成内存泄露. 局部变量本来应该在函数退出的时候被解除引用,但如果局部变量被封闭在闭包形成的环境中,那么这个局部变量就能一直生存下去.从这个意义上看,闭包的确会使一些数据无法被及时销毁.使用闭包的一部分原因是我们选择主动把一些变量封存在闭包中,因为可能在以后还需要使用这些变量,把这些变量放在闭包中和放在全局作用域,对内存方面的影响是一致的,这里并不能说成是内存泄露.如果在将来需要回收这些变量,我们可以手动把这些变量设为n

js 闭包 详解

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 闭包的特性 闭包有三个特性: 1.函数嵌套函数 2.函数内部可以引用外部的参数和变量 3.参数和变量不会被垃圾回收机制回收 闭包的定义及其优缺点 闭包 是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量 使用闭包有一个优点,也是它的缺点,就是可以把局部变量驻留在内存中,可以避免使用全局变量.全局变量在每个模块

js的垃圾回收机制

Js具有自动垃圾回收机制.垃圾收集器会按照固定的时间间隔周期性的执行. JS中最常见的垃圾回收方式是标记清除. 工作原理:是当变量进入环境时,将这个变量标记为“进入环境”.当变量离开环境时,则将其标记为“离开环境”.标记“离开环境”的就回收内存. 工作流程: 1.    垃圾回收器,在运行的时候会给存储在内存中的所有变量都加上标记. 2.    去掉环境中的变量以及被环境中的变量引用的变量的标记. 3.    再被加上标记的会被视为准备删除的变量. 4.    垃圾回收器完成内存清除工作,销毁那

关于js中的回收机制,通俗版

在前面的几篇文章中,我讲解过了js中的回收机制,但是对于当时的我来说,我自己对回收机制的这个概念也有些懵懵懂懂,现在对回收机制有了更深入的理解,所以特此发布此文给于总结,也好加深记忆. 如果你想学习闭包那么js中的回收机制是必不可少的,当然学习闭包除了需要理解js中的回收机制以外还需要了解其他的概念,我的其他文章有相关的说明,这里不做闭包的讲解. 为什么要有回收机制?why? 打个比方,我有一个内存卡,这个内存是8G的,我把文件,视频,音乐,都保存到了这个内存卡,随着我的储存的内容越来越多,这个

JS闭包

闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实在是比较晦涩,对我来说也是一样. 但是他也是js能力提升中无法绕过的一环,几乎每次面试必问,因为在回答的时候.你的答案的深度,对术语的理解以及js内部解释器的运作方式的描述,都是可以看出你js实际水平的.即使你没答对,也能让考官对你的水平有个评估.那么我先来说说我对js中的闭包的理解. 闭包是很多语言都具备的特性,在js中,闭包主要涉及到js的几个其他的特性:作用域链,垃圾(内存)回收机制,函数嵌套,等等. 在理解闭包以前.最好能先理解

javascript深入理解js闭包

一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function f1(){ var n=999; } alert(n); // error 这里有一个地方需要注意,函数

JS闭包理解_摘

原文地址1:http://www.cnblogs.com/mzwr1982/archive/2012/05/20/2509295.html 闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实在是比较晦涩,对我来说也是一样. 但是他也是js能力提升中无法绕过的一环,几乎每次面试必问的问题,因为在回答的时候.你的答案的深度,对术语的理解以及js内部解释器的运作方式的描述,都是可以看出你js实际水平的.即使你没答对,也能让考官对你的水平有个评估.那么我先来说说我对js中的闭包的理解. 闭包是

再次讲解js中的回收机制是怎么一回事。

在前几天的一篇闭包文章中我们简单的介绍了一下闭包,但是并没有深入的讲解,因为闭包涉及的知识点比较多,为了能够更好的理解闭包,今天讲解一下关于js中的回收机制. 在初识闭包一文中我说过js中有回收机制这么一回事,让我们一起回顾一下,并且深入的了解js中的回收机制到底是怎么一回事. function a(){ var num = 10; return function(){ num ++; console.log(num); } } a()(); //11 a()(); //11 按理说第二次执行函