概念:当一个函数的返回值是另一个函数,而返回值的那个函数如果调用了其父函数内部的变量,且返回的这个函数在外部被执行就产生了闭包。
闭包是一个环境,具体指的就是外部函数--高阶函数。
说的通俗一点就是一个环境,能够读取其他函数内部的变量。
本质上,闭包是将函数内部和函数外部连接起来的桥梁。
用处:1·读取内部函数的变量;
2·这些变量的值始终会保持在内存中,不会在外层函数调用后被自动清除
优点:1·变量会一直在内存中;
2·避免全局变量的污染;
3·私有变量的存在;
特性:1·函数嵌套函数;
2·内部函数可以直接使用外部函数的局部变量;
3·变量或参数不会被垃圾回收机制回收 GC;
补充一下垃圾回收机制:
在Js中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。因为函数a被b引用,b又被a外的c引用,这就是为什么函数a执行后不会被回收的原因。
缺点:变量长期储存在内存中,会增大内存的使用量 使用不当会造成内存泄露
判断闭包的3个特点:
1·函数嵌套函数;
2·内部函数一定操作了外部函数的局部变量;
3·外部函数一定将内部函数返回到外部并保存在一个全局变量中;
判断闭包的执行结果:
1·外部函数被调用了几次就有几个受保护的局部变量的副本;
2·来自一个闭包的函数被调用几次,受保护的局部变量就变化几次;