0%

JS中的闭包

定义

MDN对闭包的定义:

函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起构成闭包(closure)。闭包可以让你从内部函数访问外部函数作用域。在 JavaScript 中,每当函数被创建,就会在函数生成时生成闭包。

换种好理解的说法:

闭包是指那些能够访问自由变量的函数。自由变量是指在函数中使用的,但既不是函数参数也不是函数的局部变量的变量。

具体可以从两个角度来看什么函数是闭包:

  1. 从理论角度:所有的函数。因为它们都在创建的时候就将上层上下文的数据保存起来了。哪怕是简单的全局变量也是如此,因为函数中访问全局变量就相当于是在访问自由变量,这个时候使用最外层的作用域。
  2. 从实践角度:闭包就是能够读取其他函数内部变量的函数。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。

闭包的用途

  1. 可以读取函数内部的变量;
  2. 让变量的值始终保持在内存中;

为什么闭包会造成内存泄漏?

早期的IE,无法自动回收闭包引用的变量,变量用不上又回收不掉自然就造成了内存泄漏。其实这个问题本身就是有问题的,闭包不会造成内存泄漏,程序写错了才会造成内存泄漏。