闭包哇,赐予我力量!

142 阅读2分钟

作用域

作用域表示当前的执行上下文,作用域表示变量和函数的可作用范围。最外层的为全局作用域(即:window对象),函数中的作用域为函数作用域,es6之后才有了块级作用域。

作用域链

作用域链就是通过在当前作用域内部查找需要的变量,如果有则访问,没有的话继续向上查找,直到找到为止 ,如果到window还没找到,就报错。

闭包是什么

红宝书:闭包是指引用了另外一个函数作用域中变量的函数。

闭包形成原因

内部的函数存在对外部作用域中变量的引用。

闭包的作用(好处)

  1. 保存函数的私有变量不受外界影响,使变量长期驻扎在内存中。

  2. 延长了函数的生命周期,把一些函数内的值保存下来,实现方法和属性的私有化,避免全局变量的污染

闭包出现场景

  • 在函数中返回一个函数,内层函数用到了外层函数作用域中的变量;

  • 立即执行函数的内部有函数用到了被立即执行函数作用域中的变量;

  • 循环产生定时器,且定时器内部用到了外部变量;

使用闭包应该注意

使用不当可能会造成内存泄漏。 不再用到的内存,没有及时释放(解决:最后将对象置空

其他内存泄漏的情况

  • 意外产生的全局变量(使用变量时拼写错误导致生成全局变量)

  • 被遗忘的计时器或回调函数

垃圾回收机制

什么是垃圾回收机制?

确定哪个变量不在使用,让后释放其内存的周期性行为就是垃圾回收机制

闭包中的变量不会被垃圾回收机制所释放

为什么要进行垃圾回收?

程序不用的内存或者是之前用过了,以后不会再用的内存空间需要被释放

垃圾回收是怎样进行的?

标记清除算法:

  1. 先将内存中所有变量进行标记

  2. 然后将所有上下文中的变量及其所引用的变量的标记去除

  3. 之后回收依旧带有标记的变量

引用计数(不常用)