JS 闭包
简单
shell
# 闭包
内部函数访问了外部函数作用域的变量,并且内部函数被暴露到外部执行,这个内部函数本身,就叫闭包函数(外部函数只是提供作用域、提供私有变量,它不是闭包)
# 作用
闭包让外部函数中被引用的变量无法在函数执行完毕后,被垃圾回收掉
# 用途
延长变量的生命周期,比如:防抖、节流、缓存
变量私有化
模块化
柯里化
高阶函数
# 如何释放闭包?
释放闭包唯一方法:把指向闭包函数的外部变量 = null
引擎不会主动释放闭包,必须手动断引用拓展
shell
# 如果不暴露到外部执行呢?内部函数还是闭包函数吗?
答案:是闭包!是闭包!是闭包!
只要内部函数定义时,访问了外层作用域变量,这个函数天生就绑定了外层词法作用域,它天生就是闭包。
区别是导出后有表现效果,明确知道还保留着
# 闭包中外部函数没被引用的变量在外部函数执行完会被回收掉吗?
答案:不会回收!不会回收!不会回收!
内部闭包存在 + 引用外层作用域 -> 外层整个作用域全部不回收,没用的变量也不回收(内存泄漏根源)
# 释放闭包的原理?
闭包之所以不释放,是因为外部变量一直在引用内部函数,只要断掉这个引用 → 闭包自动释放
# 如果闭包函数没有指向他的外部变量呢?
那说明此函数没被 return 到外面执行,那肯定是在外部函数的内部执行了,如此这个闭包在执行的时候会被垃圾回收掉
# 最后
闭包会不会常驻内存,只看有没有人引用它