闭包
闭包指的是那些引用了另一个函数作用域中变量的函数,通常是在嵌套函数中实现的。
闭包的经典应用场景有围绕保存状态和封装私有性两种,比如封装操作函数避免直接访问私有变量,比如事件回调函数中引用上下文变量或防抖节流中的计时器。
闭包和内存泄漏
如果程序持续分配内存但又不释放内存,就会发生内存泄漏。
函数闭包允许被引用的作用域变量超出预期的生命周期而存在,只要闭包本身仍然可达,这些变量就不会被垃圾回收;
比如在页面生命周期内,未移除的 window 事件监听器闭包会一直可达,不会被垃圾回收;尤其是在单页面应用中,页面不会刷新,window 和全局环境长期存活,所以闭包、事件监听器、订阅必须手动管理好,否则容易内存泄漏。
Tips: 箭头函数没有自己的this,它的this继承定义时的作用域;普通函数的this是动态绑定的,不会被闭包捕获。