文章目录

  • 前言
  • 一、闭包是什么?
  • 二、闭包有什么好处和坏处呢?
    • 1.好处
    • 2.坏处
  • 二、闭包会造成内存泄露吗?
    • 1.前言
    • 2.闭包会造成内存泄露吗,如果会为什么还会再react hooks中大量使用呢?
  • 三、为什么ie8及之前会造成内存泄露?
    • 1.为什么会造成内存泄露
    • 2.引用计数的缺陷
    • 3.为什么ie8及之前还会存在引用计数呢?
  • 总结

前言

相信大家在学习前端的路上都有接触到过闭包这个东西,并且这也是面试中的常客。那么闭包究竟是个什么呢?让我们一起来看看吧。

一、闭包是什么?

函数内部的变量不会影响到外部作用域,并且父函数返回的子函数可以访问到其父函数作用域的变量。

换句通俗的话说呢,就是一个作用域能访问另一个作用域的变量,且局部变量会常驻在内存中不会被回收。

二、闭包有什么好处和坏处呢?

1.好处

1.可以让外部函数访问内部变量。

2.能将局部变量存储在内存中达到重复使用。

3.可以避免使用全局变量造成全局污染。

2.坏处

会造成内存泄露(此处并不是绝对的,下面我将详细探讨闭包的内存泄露问题)

二、闭包会造成内存泄露吗?

1.前言

之前因为自己没有去实践过,所以看到网上说闭包会造成内存泄露,也就这么认为了。

在我学习了react hooks之后,我发现hook里面的useState就是利用闭包来实现每次渲染保持变量不变的,当时我就在想,如果闭包会造成内存泄露,那么react hooks里面不就会使用大量的闭包吗?这样的话性能也太差了吧?带着疑问,我查阅了书籍还有资料,发现了这个问题。

2.闭包会造成内存泄露吗,如果会为什么还会再react hooks中大量使用呢?

首先,闭包会造成内存泄露!!!但是只在ie8及之前会造成内存泄露。
现在的闭包已经不会造成内存泄露了。

三、为什么ie8及之前会造成内存泄露?

如果要探讨内存泄露这个问题,首先我们得先搞清楚,为什么会造成内存泄漏?

1.为什么会造成内存泄露

这一点得从垃圾回收机制说起,感兴趣的朋友可以去看我的另一篇专门讲垃圾回收机制的博客。
带你探索垃圾回收

首先,我们知道现在最常用的垃圾回收策略是标记清除,但在最早的时候,我们是使用引用计数来作为我们的垃圾回收策略的,但因为引用计数存在一些问题,所以被弃用了,但是,内存泄漏就是由引用计数造成的!!!!

2.引用计数的缺陷

引用计数的大概思路就是给声明变量赋给一个引用值,如果值被赋给另一个变量就+1,如果被覆盖就-1,当引用数为0时,就会释放这个值的内存。

引用计数存在了一个很严重的问题,循环引用。
循环引用的意思就是对象A有一个指针指向对象B,而对象B也引用了对象A,比如:

 function problem() {let objA = new Object()let objB = new Object()ObjA.test1 = objBobjB.test2 = objA}

这个例子中,objA和objB通过各自的属性相互引用,导致引用数都是2.,在引用计数下,他们引用数永远不会到达0,如果函数被多次调用,则会导致大量内存永远不会被释放,从而造成内存泄露!

3.为什么ie8及之前还会存在引用计数呢?

在ie8及更早的版本中,并非所有对象都是原生js对象。BOM和DOM中的对象是C++实现的组件对象模型对象,简称COM对象。

COM对象是使用引用计数实现垃圾回收的,所以,即使这些版本的ie已经使用标记清除,但js存取的COM对象依旧是使用引用计数的。所以只要涉及到了COM对象,那么就会遇到循环引用的问题,比如:

 let box = document.querySelector('.box')let obj = new Object()obj.box = boxbox.obj = obj

在这个例子里,DOM对象和原生js对象之间造成了循环引用,所以DOM元素的内存永远不会被清除。从而造成内存泄漏

总结

在ie9之后已经全面改成了js对象啦,这避免了由于存在两套垃圾回收算法而导致的问题,还解决了内存泄露现象!

现在我们可以愉快的使用闭包啦!

闭包真的还会造成内存泄露吗?你不知道的闭包与垃圾回收!相关推荐

  1. 搞不定 NodeJS 内存泄漏?先从了解垃圾回收开始

    通常来说,内存管理有两种方式,一种是手动管理,一种是自动管理. 手动管理需要开发者自己管理内存,什么时候申请内存空间,什么时候释放都需要小心处理,否则容易形成内存泄漏和指针乱飞的局面.C 语言开发是典 ...

  2. 既然有 GC 机制,为什么还会有内存泄露的情况

    理论上 Java 因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是 Java 被广泛使用于服务器端编程的一个重要原因). 然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被 GC 回收 ...

  3. js内存泄露 垃圾回收_Java内存体系结构(模型),垃圾回收和内存泄漏

    js内存泄露 垃圾回收 Java内存架构(Java内存模型) 上面是堆的Java内存模型以及Java虚拟机(JVM)中运行的任何Java应用程序的PermGen. 还提供了比率,以使您更好地了解如何在 ...

  4. Java内存体系结构(模型),垃圾回收和内存泄漏

    Java内存架构(Java内存模型) 上面是堆的Java内存模型以及Java虚拟机(JVM)中运行的任何Java应用程序的PermGen. 还提供了比率,以使您更好地了解如何在每种世代类型之间分配允许 ...

  5. 015、JVM实战总结:大厂面试题:什么情况下JVM内存中的一个对象会被垃圾回收?

    1.什么时候会触发垃圾回收? 新生代放不下了 2.被哪些变量引用的对象不能回收? 对象被方法的局部变量.类的静态变量给引用了,就不会回收他们. 可达性分析算法来判定哪些对象是可以被回收的.算法的思想: ...

  6. 什么情况下JVM内存中的一个对象会被垃圾回收

    问题1:  哪些对象能回收,哪些对象不能被回收 1.引用计数算法 (ref count) 2.可达性算法  (root searching) JVM 使用可达性算法     判断哪些对象可以被回收.也 ...

  7. Java工程师必备:JVM原理、内存模型、调优、垃圾回收机制、面试题

    在如今这个时间和知识都是碎片化的时代,C站根据C1-C4认证的成长路径,进行知识细化整理,形成系统化的知识图谱. 通过调研一线互联网大厂的招聘JD,小编对标C站能力认证要求,为大家整理了系列技术干货合 ...

  8. 说说JS在IE中的内存泄露问题

    首先说说什么是内存泄露,在一个进程中,如果某一块内存无法访问,且直到进程结束为止也无法释放,那么就发生了内存泄露.通常这种情况发生在C++之类的手动管理内存的语言编写的程序中,程序员忘记delete或 ...

  9. android的内存泄露有几种,Android中几种有可能会导致内存泄露的情况

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 1.Static静态成员导致的内存泄露 将占用大量内存空间的变量声明为static静态类型.当Activity被销毁的时 ...

最新文章

  1. 多索引表 (2)基本概念
  2. TEA加密算法的C/C++实现
  3. .NET C#使用微信公众号登录网站
  4. mysql 虚拟列索引_使用MySQL 5.7虚拟列提高查询效率
  5. python抓取贴吧_python抓取百度贴吧-校花吧,网页图片
  6. python可以读取excel文档吗_python打开excel文件【python读取excel文件如何进行】
  7. Eclipse开发环境下,部署和配置svn的整个过程
  8. 量化交易软件 python_我用Python做了个量化交易工具!
  9. 近期流行手机病毒“手机骷髅”解决方案
  10. 微信小程序【WXSS 文件编译错误】unexpected “?“at pos 1的解决办法。
  11. 李佳琦、薇娅们的残酷生存物语
  12. 机器学习-基础知识 - Precision, Recall, Sensitivity, Specificity, Accuracy, FNR, FPR, TPR, TNR, F1 Score
  13. Android打字机动画,Android自定义View实现打字机效果
  14. IPU VPU GPU的关系
  15. 年底谷歌扎堆升职,L3到L6升一级多$10w
  16. 了解代码管理系统Git相关产品
  17. 平面几何中的几个著名定理
  18. 图像分割:DeepLabV3与DeepLabV3+介绍
  19. MySQL数据库编程01
  20. Ableton Live 10 Suite v10.1.42 WiN-MAC 音乐制作宿主软件

热门文章

  1. 2018年60家新创公司排行榜
  2. 三菱fx1n40mr001接线图_三菱FX1N-14MR-001使用说明书FX1N-14MR-001手册 - 广州凌控
  3. 如何使用PageAdmin Cms建网站
  4. Python成长之路——regex,bs4,xpath,jsonpath的使用
  5. hvie启动及基本命令
  6. 完全用linux 转载自清华退学生
  7. Jedis cluster客户端使用
  8. [英语阅读]澳门酒店高价拍得杰克逊手套
  9. 中国扬声器行业销售现状与客户策略研究报告2021-2026年
  10. linux 环境安装配置,Linux相关环境安装与配置