什么是闭包?
闭包 是指内部函数总是可以访问其所在的外部函数中声明的变量和参数,即使在其外部函数被返回(寿命终结)了之后
- 函数嵌套函数
- 内部函数使用外部函数的形参和变量
- 被引用的形成和变量不会被垃圾回收机制所回收
在 JavaScript 中,所有函数都是天生闭包的(只有一个例外)因为JS函数在创建时保存了当前的词法环境,任何JS函数都可以通过链式作用域访问到外部环境的变量,所以每个函数都可以看成是闭包。
子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。这就是Javascript语言特有的"链式作用域"结构(chain scope)
好处?
- 希望一个变量常驻在内存当中
- 避免全局变量污染,避免声明全局变量
- 可以声明私有成员
注意事项
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。