面经复习| 青训营笔记

81 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第15天

闭包

  1. 定义 其实理解,但是总是说不出来

父函数被销毁 的情况下,返回出的子函数的[[scope]]中仍然保留着父级的单变量对象和作用域链,因此可以继续访问到父级的变量对象

在一个内层函数中访问到其外层函数的作用域

  1. 问题
  • 子函数和父函数同时指向父级,完全共享,修改时都会受到影响
  • 内存泄漏问题:针对v8垃圾回收机制,父函数存在引用数,变量无法被回收
  1. 作用
  • 可以读取函数内部的变量
  • 可以使变量的值长期保存在内存中,生命周期比较长。
  • 可用来实现JS模块(JQuery库等)——将数据和功能封装在一个函数内,暴露调用方法实现对应功能
  1. 使用案例

js模块 回调函数本质是闭包 getter和setter

补充 5. 内存泄漏:

内存泄露是指:用动态存储分配函数内存空间,在使用完毕后未释放,导致一直占据该内存单元。直到程序结束。指任何对象在你不再拥有或需要它之后仍然存在。

发生内存泄露的可能:

  1. 全局变量

  2. 定时器

  3. 闭包

  4. 没有清理对DOM元素的引用

  5. 垃圾回收机制

根据数据的存储方式分为栈垃圾回收堆垃圾回收栈垃圾回收的方式非常简便,当一个函数执行结束之后,JavaScript 引擎会通过向下移动 ESP 来销毁该函数保存在栈中的执行上下文,遵循先进后出的原则。

堆回收: V8 中会把堆分为新生代和老生代两个区域,新生代中存放的是生存时间短的对象,老生代中存放的生存时间久的对象。 新生区中使用Scavenge算法,老生区中使用标记-清除算法和标记-整理算法。 方法: 标记清除/标记整理 引用计数方法

之后会保持更新