美文网首页
闭包不会造成内存泄漏哦!

闭包不会造成内存泄漏哦!

作者: 易推倒DE小狼 | 来源:发表于2019-10-02 19:34 被阅读0次

昨天晚上上了网易前端微专业的第一次直播课,感觉非常好,老师也普及了一个之前面试经常会被问到的问题——闭包。并且老师在一开始提出了一个近乎颠覆之前认知的一个结论:闭包不会造成内存泄漏
相信这个结论也颠覆了很多人的一个认知,那么我们接下来就来看看网易的老师是怎么解释这个问题的吧。
闭包的概念最早出现于60年代,最早实现闭包的程序语言是[Scheme]。之后,闭包被广泛使用于[函数式编程]。
实际上,闭包是一种带有执行环境的函数。执行环境包括了:函数的词法环境(this、作用域)、标识符列表(用到但是未声明的变量)、表达式部分(函数体)。
下面举一个JS中闭包的例子:

function fn(){
  var a = 2;
  return function (){
    console.log(a)    //2;
  }
}
fn()();

在上面的例子中我们可以看到,在内部函数中,我们并没有声明变量a,可是输出结果却是2。这个a就属于用到但未声明的变量,这也就是闭包与一般函数最大的区别所在。

那么闭包到底会不会造成内存泄漏呢?
我们先来看维基百科里对于内存泄漏的定义:

在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。

上面这段定义用通俗点的方法讲就是:内存泄漏就是一些可以避免的内存花销
那么我们再回过头看上面的例子,变量a是有实际用途的,因此这样的内存开销是不可避免的,因此这样的形式并不叫内存泄漏。

那么是什么原因会造成闭包会出现内存泄漏这种说法的呢?下面这张图给出了答案:



由于IE的垃圾回收机制采用的是引用计数策略,所以才会有闭包会造成内存泄漏的说法。

引用计数是计算机编程语言中的一种内存管理技术,是指将资源(可以是对象、内存或磁盘空间等等)的被引用次数保存起来,当被引用次数变为零时就将其释放的过程。

而诸如Chrome、Firefox等现代浏览器的垃圾回收机制是标记清除式的垃圾回收算法。

标记清除:垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记,然后,它会去掉环境中的变量的标记和被环境中的变量引用的变量的标记,此后,如果变量再被标记则表示此变量准备被删除。

至此我们应该已经明白了,JS中内存泄漏的真正的罪魁祸首,也理解了闭包和内存泄漏的概念。希望下次再被问到闭包相关的问题的时候,我们不再不知所措。

参考资料:

  1. 维基百科 -- 闭包
  2. 维基百科 -- 内存泄漏
  3. 维基百科 -- 引用计数

相关文章

  • 闭包不会造成内存泄漏哦!

    昨天晚上上了网易前端微专业的第一次直播课,感觉非常好,老师也普及了一个之前面试经常会被问到的问题——闭包。并且老师...

  • 什么是闭包?闭包的好处是什么?

    什么是闭包,闭包的好处 闭包 : 再函数外部可以访问函数内部的变量 好处: 坏处: 容易造成内存泄漏 闭包的相关应...

  • 闭包

    闭包:外层函数能够访问内层变量的函数,缺点就是容易造成内存泄漏。

  • 闭包的作用

    闭包:内部函数保存到外部 当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成内存泄漏(内存...

  • *闭包(上)与立即执行函数[JavaScript_007]

    闭包 定义 :内部函数被保存到外部,将生成闭包 危害 :导致原有作用域链不释放,造成内存泄漏 作用实现公有变量 此...

  • JS中闭包以及垃圾回收机制

    闭包 闭包是指一个函数可以访问另一个函数中的变量。 常见的形式:函数里嵌套函数。 缺点:大量使用闭包会造成内存泄漏...

  • 闭包会造成内存泄漏吗?

    前言 在谈内存泄漏这个问题之前先看看JavaScript的垃圾收集机制,JavaScript 具有自动垃圾收集机制...

  • iOS内存泄漏易错点

    问题 记录一个内存泄漏的案例,闭包引用自己或者多个对象,导致对象无法正常销毁,从而导致内存泄漏。 上面例子的闭包中...

  • Js闭包

    闭包的概念 闭包就是能够在函数外部能够读取其他函数内部变量的函数,且变量一直存在,处理不得当会造成内存泄漏。

  • 闭包1(基础)

    (什么是闭包?闭包的作用?闭包的缺陷?) (闭包的几种可能的应用场景) (闭包与内存泄漏,有关闭包的面试题) 推荐...

网友评论

      本文标题:闭包不会造成内存泄漏哦!

      本文链接:https://www.haomeiwen.com/subject/upteyctx.html