这是我参与「第五届青训营 」伴学笔记创作活动的第15天
闭包
- 定义 其实理解,但是总是说不出来
父函数被销毁 的情况下,返回出的子函数的[[scope]]中仍然保留着父级的单变量对象和作用域链,因此可以继续访问到父级的变量对象
在一个内层函数中访问到其外层函数的作用域
- 问题
- 子函数和父函数同时指向父级,完全共享,修改时都会受到影响
- 内存泄漏问题:针对v8垃圾回收机制,父函数存在引用数,变量无法被回收
- 作用
- 可以读取函数内部的变量
- 可以使变量的值长期保存在内存中,生命周期比较长。
- 可用来实现JS模块(JQuery库等)——将数据和功能封装在一个函数内,暴露调用方法实现对应功能
- 使用案例
js模块 回调函数本质是闭包 getter和setter
补充 5. 内存泄漏:
内存泄露是指:用动态存储分配函数内存空间,在使用完毕后未释放,导致一直占据该内存单元。直到程序结束。指任何对象在你不再拥有或需要它之后仍然存在。
发生内存泄露的可能:
-
全局变量
-
定时器
-
闭包
-
没有清理对DOM元素的引用
-
垃圾回收机制
根据数据的存储方式分为栈垃圾回收和堆垃圾回收。 栈垃圾回收的方式非常简便,当一个函数执行结束之后,JavaScript 引擎会通过向下移动 ESP 来销毁该函数保存在栈中的执行上下文,遵循先进后出的原则。
堆回收: V8 中会把堆分为新生代和老生代两个区域,新生代中存放的是生存时间短的对象,老生代中存放的生存时间久的对象。 新生区中使用Scavenge算法,老生区中使用标记-清除算法和标记-整理算法。 方法: 标记清除/标记整理 引用计数方法
之后会保持更新