闭包是函数和声明该函数的词法环境的组合。MDN上做了很详细的说明:闭包
在这总结一下自己的理解
要理解闭包就要先了解js的词法作用域,词法作用域意味着作用域是由书写代码时函数声明的位置来决定的。当一个块或函数嵌套在另一个块或函数中时, 就发生了作用域的嵌套。 因此, 在当前作用域中无法找到某个变量时, 引擎就会在外层嵌套的作用域中继续查找, 直到找到该变量,或抵达最外层的作用域( 也就是全局作用域) 为止。
闭包的应用:
- 将函数与其所操作的某些数据(环境)关联起来;即为Dom元素绑定回调函数;
- 闭包模拟私有方法,即模块模式内,由于闭包的存在,声明的变量和方法只在该模式内部可用。但在返回对象上定义的变量和方法,则对外部使用者都是可用的。多个公共函数可共享一个词法作用域;
- 因为多个闭包会共享同一词法作用域;在for循环中绑定事件的时候我们肯定不希望这样,可使用let声明变量或函数工厂或匿名闭包,,为每一个回调创建一个新的词法环境来解决。