定义:
在一个内层函数可以访问到其外层函数的作用域
优点:
- 函数生命周期延长:函数内部的变量在函数执行完之后依然存在,方便之后的调用和使用
- 函数记忆化:函数结果可以缓存起来,避免重复计算,提高执行效率
- 函数递归调用:通过自身引用的方式来递归调用函数
- 数据封装与保护:可以将变量封装在函数内部,对外部不可见
缺点
- 内存占用:会长期持有外部环境的引用,长世间存在的闭包。如果不加以管理会导致内存泄漏问题
- 性能消耗:由于会涉及到变量的查找和作用域链的操作,会增加一些性能消耗。性能敏感的应用中谨慎使用
- 调试困难:跟踪变量的来源和变化会比较困难
使用场景:
- 通过闭包实现setTimeout调用传参数,模仿块级组用语 例如:
for(var i = 0; i < 5; i++) {
(function(j){
setTimeout(() => {
console.log(j);
}, j * 1000);
})(i)
}
- 作为一个回调绑定事件上
- 例如:例如点击或者按键等用户事件
-
函数防抖:在事件触发n秒中之后在执行回调,但是n秒又重新被触发,则重新记时
- 例如:输入框实时搜索,频繁请求接口
- 小范围代替全局变量:利用私有和特权成员,可以隐藏那些不应该被直接修改的数据