1.定义

数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起构成闭包,闭包可以让从内部函数访问外部函数作用域,在JavaScript中,每当函数被创建,就会在函数创建时形成闭包.从技术角度讲,所有的JavaScript函数都是闭包

ECMAScript中,闭包指的是:
1.从理论角度:所有的函数,因为它们都在创建的时候就将上层上下文的数据保存起来了(静态词法作用域),哪怕是简单的全局变量也是如此,因为函数中访问全局变量就相当于访问自由变量,这个时候使用最外层的作用域。
2.从实践角度:
1.即使创建它的上下文已经销毁,它仍然存在(比如,内部函数从父函数中返回)
2.在代码中引用了自由变量

闭包形成的根本原因在于:函数创建时内部属性[[scope]]保存了上层上下文的变量对象.在函数执行时,复制函数的[[scope]]属性创建作用域链,初始化AO,将AO压入作用域链顶端,这时,无论上层上下文是否销毁,当前执行函数都保存有上层上下文的引用.
**
参考:javaScript深入之闭包