面试题:闭包、作用域链、内存泄漏

简介: 面试题:闭包、作用域链、内存泄漏

1.闭包(Closure)


1.1 是什么?

并没有标准答案。介绍个非标准答案作为参考。

非标答案1:“闭包就是能够读取其他函数内部变量的函数”

个人理解(出处忘记了):闭包就是指一个作用域有权访问另一个作用域中的局部变量,本质仍是函数。

最常见的闭包:嵌套的函数中,子函数可以使用父函数中的变量。父无法使用子函数的变量,改变子函数中的变量,父函数中的变量不会变

以一段代码展示闭包:(从代码形式上看闭包是一个做为返回值的函数)

<script>
  function foo() {
    let i = 0;
    // 函数内部分函数
    function bar() {
      console.log(++i);
    }
    // 将函数做为返回值
    return bar;
  }
  // fn 即为闭包函数
  let fn = foo();
  fn(); // 1
</script>

1.2 作用?

1.闭包能够创建外部可访问的隔离作用域避免全局变量污染

举个例子:嵌套的两个函数,父函数定义a=2,子函数将a改成1,那么再两个函数中分别打印的话,分别是2 和 1 ,原因就是闭包(当然根本原因是函数作用域,就是每个作用域都是独立的)

2.延长变量的使用范围

1.3 缺点?

过度使用可能导致内存泄漏

1.4 实际中的使用

实际工作中,经常写出闭包,换言之,在日常开发中,闭包可谓“”无处不在“”

2.内存泄漏


2.1 是什么?

说法一:内存泄漏指任何对象在您不再拥有或需要它之后仍然存在

说法二:指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。

正常情况下,js的垃圾回收机制,会清理变量和函数,什么时候清理呢?就是这个变量或者函数,除了你定义时,其他时候不使用它了,就会被垃圾回收机制回收。

2.2 引起内存泄漏的原因和解决方法

1、意外的全局变量引起的内存泄漏

原因:全局变量,不会被回收。

解决:使用严格模式避免

2、闭包引起的内存泄漏

原因:闭包可以维持函数内局部变量,使其得不到释放。

解决:将事件处理函数定义在外部,接触闭包,或者在定义事件处理函数的外部函数中,删除对DOM的引用。

3、没有清理的DOM元素引用

原因:虽然别的地方删除了,但是对象中还存在DOM的引用。

解决:手动删除

4、被遗忘的定时器或者回调

原因:定时器中有DOM的引用,即使DOM删除了,但是定时器还在,所以内存中还是有这个DOM。

解决:手动删除定时器和DOM

5、子元素存在引用引起的内存泄漏

原因:p中的ul li 得到这个p,会间接引用某个得到的li,那么此时因为p间接引用li,即使li被清空,也还在内存中,并且只要li不被删除,它的父元素都不会被删除。

解决:手动删除情空

3.作用域链


3.1 是什么?

作用域连成的链状结构,提供变量的查找机制

3.2 特点

  1. 相同作用域链中按着从小到大的规则查找变量
  2. 子作用域能够访问父作用域,父级作用域无法访问子级作用域(就近原则)
  3. 外部无法访问内部的变量

3.3 作用

延长变量的使用范围(可以用父级,乃至祖宗级的变量)

避免变量污染(外部无法访问函数作用域,就近原则)

提供变量的查找机制

关于闭包和作用域的区别还没有一个完整的答案,感觉他们俩在很多方面是共通的,等以后再来填坑吧。

相关文章
|
1月前
|
Arthas 监控 Java
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。
|
1月前
|
存储 JavaScript 前端开发
如何优化代码以避免闭包引起的内存泄露
本文介绍了闭包引起内存泄露的原因,并提供了几种优化代码的策略,帮助开发者有效避免内存泄露问题,提升应用性能。
|
1月前
|
Web App开发 缓存 JavaScript
如何检测和解决闭包引起的内存泄露
闭包引起的内存泄露是JavaScript开发中常见的问题。本文介绍了闭包导致内存泄露的原因,以及如何通过工具检测和代码优化来解决这些问题。
|
2月前
|
监控 Java easyexcel
面试官:POI大量数据读取内存溢出?如何解决?
【10月更文挑战第14天】 在处理大量数据时,使用Apache POI库读取Excel文件可能会导致内存溢出的问题。这是因为POI在读取Excel文件时,会将整个文档加载到内存中,如果文件过大,就会消耗大量内存。以下是一些解决这一问题的策略:
261 1
|
2月前
|
Java API 对象存储
JVM进阶调优系列(2)字节面试:JVM内存区域怎么划分,分别有什么用?
本文详细解析了JVM类加载过程的关键步骤,包括加载验证、准备、解析和初始化等阶段,并介绍了元数据区、程序计数器、虚拟机栈、堆内存及本地方法栈的作用。通过本文,读者可以深入了解JVM的工作原理,理解类加载器的类型及其机制,并掌握类加载过程中各阶段的具体操作。
|
3月前
|
缓存 监控 NoSQL
阿里面试让聊一聊Redis 的内存淘汰(驱逐)策略
大家好,我是 V 哥。粉丝小 A 面试阿里时被问到 Redis 的内存淘汰策略问题,特此整理了一份详细笔记供参考。Redis 的内存淘汰策略决定了在内存达到上限时如何移除数据。希望这份笔记对你有所帮助!欢迎关注“威哥爱编程”,一起学习与成长。
|
2月前
|
JavaScript 前端开发 安全
如何避免闭包带来的内存消耗呢
【10月更文挑战第12天】如何避免闭包带来的内存消耗呢
36 0
|
2月前
|
存储 Kubernetes 架构师
阿里面试:JVM 锁内存 是怎么变化的? JVM 锁的膨胀过程 ?
尼恩,一位经验丰富的40岁老架构师,通过其读者交流群分享了一系列关于JVM锁的深度解析,包括偏向锁、轻量级锁、自旋锁和重量级锁的概念、内存结构变化及锁膨胀流程。这些内容不仅帮助群内的小伙伴们顺利通过了多家一线互联网企业的面试,还整理成了《尼恩Java面试宝典》等技术资料,助力更多开发者提升技术水平,实现职业逆袭。尼恩强调,掌握这些核心知识点不仅能提高面试成功率,还能在实际工作中更好地应对高并发场景下的性能优化问题。
|
4月前
|
存储 安全 Java
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别;什么是程序计数器,堆,虚拟机栈,栈内存溢出,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
|
5月前
|
存储 Java 程序员
Java面试题:方法区在JVM中存储什么内容?它与堆内存有何不同?
Java面试题:方法区在JVM中存储什么内容?它与堆内存有何不同?
82 10