- 闭包的形成与变量的作用域以及变量的生命周期有密切的关系
- 闭包就是能够读取其他函数内部变量的函数。
- 闭包发生在创建函数时,实质是一个作用域,在该作用域中允许该自身函数访问并且操作该自身函数之外的变量。
闭包的核心原则:
1,内部函数的参数是包含在闭包中的;
2,作用域之外的所有变量,即便是函数声明之后的那些声明,也都包含在闭包中;
3,在相同的作用域中,尚未声明的变量不能提前引用(变量提升)
闭包的形成
- 内部函数在包含它们的外部函数之外被调用时,就会形成闭包。
- 函数套函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用域链,将函数内部的变量和方法传递到外部,延续变量的生命。
闭包的优点
使用闭包实际上是在如何使用JS中的作用域特性。
1,利用闭包作用域特性可以将一些变量(函数也是变量)隐藏起来,实现私有化。为什么要隐藏呢?依据软件设计中的最小特权原则,应该最小限度的暴露必要内容,而将其他内容都隐藏起来,比如某个模块或者对象的API设计。如果所有变量和函数都在全局作用域中,当然可以在所有的内部嵌套作用域中都访问到它们。但是一句最小特权原则应该设法将其私有化。
2,规避冲突。像jQuery等第三方库都会妥善的将内部私有的函数和变量隐藏起来,防止在使用过程中如果有意或者无意使用了相同的变量名或者函数名引发冲突。
闭包的缺点
由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大。所以在闭包不用之后,将不使用的局部变量删除,使其被回收。在IE中可能导致内存泄露,即无法回收驻留在内存中的元素,这时候需要手动释放。