闭包是一种形式,内部函数可以访问其所在的外部函数中声明的参数和变量,因为变量被引用着所以不会被回收,因此可以用来封装一个私有变量。这是优点也是缺点,不必要的闭包只会徒增内存消耗!
至于了解闭包原理,你需要知道以下两个知识点
1.首先需要了解作用域和作用域链
作用域就是变量和函数的可访问范围
分为全局作用域 和 局部作用域(函数作用域)
全局作用域的变量 在代码任何地方都能访问
局部作用域在函数内部能够访问 函数外部不能直接访问
js作用域链规则是由内到外逐级查找并且不可逆。
由于作用域的关系 父函数变量对子函数可见,子函数能引用父函数的变量,而且可以通过编写一些方法使外部函数能够获取或修改这个变量的值
2.其次需要知道js的垃圾回收机制
全局变量在页面关闭时被销毁,局部变量在函数执行完毕被销毁,由于闭包形式内部函数不算执行完毕,因为内部函数还保持着对其外部函数变量的引用,所以这个变量会一直保存在内存之中。