前言
"闭包" 在 JavaScript 中是一种神奇的存在, 很多 GreenHand 都很迷惑, 什么是闭包? 本文会醍醐灌顶式给你灵魂一击~
那么先简单写一个闭包, 有一个简单的认识.
- function A() {
- var count = 0;
- function B() {
- count++;
- console.log(count);
- }
- return B;
- }
- var C = A();
- C(); // this is "闭包"
函数 B()的词法作用域能访问 A()的内部作用域, B 所引用的函数本身作为返回值.
C 的调用实际上只是通过不同标识符调用了函数 B().B 被执行了, 还是在它定义的词法作用域外执行的, 哟, 神奇吗.
函数 A 执行完成, 正常 GC 会把内部变量进行回收, 但是 A 作用域内的变量并没有进行回收, 是谁在使用这个内部作用域呢, 显然是 B. 此作用域会一直存在, 供 B 随时使用.
B()依然持有对该作用域的引用, 这个引用就叫做闭包.
我们来看下闭包在业界是怎样描述的:
在维基百科中的描述是:
在计算机科学中, 闭包 (英语: Closure), 又称词法闭包(Lexical Closure) 或函数闭包(function closures), 是引用了自由变量的函数. 这个被引用的自由变量将和这个函数一同存在, 即使已经离开了创造它的环境也不例外. 所以, 有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体. 闭包在运行时可以有多个实例, 不同的引用环境和相同的函数组合可以产生不同的实例.
在 JavaScript 高级程序设计 (第 3 版) 中的描述:
闭包是指有权访问另一个函数作用域中的变量的函数.
总结下:
当函数可以记住并访问所在词法作用域, 即使函数是在当前此法作用域之外执行, 这时就产生了闭包.
来源: http://www.jianshu.com/p/384f95aef6c9