定义
MDN对闭包的定义:
函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起构成闭包(closure)。闭包可以让你从内部函数访问外部函数作用域。在 JavaScript 中,每当函数被创建,就会在函数生成时生成闭包。
换种好理解的说法:
闭包是指那些能够访问自由变量的函数。自由变量是指在函数中使用的,但既不是函数参数也不是函数的局部变量的变量。
具体可以从两个角度来看什么函数是闭包:
- 从理论角度:所有的函数。因为它们都在创建的时候就将上层上下文的数据保存起来了。哪怕是简单的全局变量也是如此,因为函数中访问全局变量就相当于是在访问自由变量,这个时候使用最外层的作用域。
- 从实践角度:闭包就是能够读取其他函数内部变量的函数。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
闭包的用途
- 可以读取函数内部的变量;
- 让变量的值始终保持在内存中;
为什么闭包会造成内存泄漏?
早期的IE,无法自动回收闭包引用的变量,变量用不上又回收不掉自然就造成了内存泄漏。其实这个问题本身就是有问题的,闭包不会造成内存泄漏,程序写错了才会造成内存泄漏。