闭包

53 阅读1分钟

定义:

在一个内层函数可以访问到其外层函数的作用域

优点

  • 函数生命周期延长:函数内部的变量在函数执行完之后依然存在,方便之后的调用和使用
  • 函数记忆化:函数结果可以缓存起来,避免重复计算,提高执行效率
  • 函数递归调用:通过自身引用的方式来递归调用函数
  • 数据封装与保护:可以将变量封装在函数内部,对外部不可见

缺点

  • 内存占用:会长期持有外部环境的引用,长世间存在的闭包。如果不加以管理会导致内存泄漏问题
  • 性能消耗:由于会涉及到变量的查找和作用域链的操作,会增加一些性能消耗。性能敏感的应用中谨慎使用
  • 调试困难:跟踪变量的来源和变化会比较困难

使用场景

  • 通过闭包实现setTimeout调用传参数,模仿块级组用语 例如:
    for(var i = 0; i < 5; i++) { 
        (function(j){ 
            setTimeout(() => { 
                console.log(j); 
             }, j * 1000); 
         })(i) 
     }


  • 作为一个回调绑定事件上
    • 例如:例如点击或者按键等用户事件
  • 函数防抖:在事件触发n秒中之后在执行回调,但是n秒又重新被触发,则重新记时

    • 例如:输入框实时搜索,频繁请求接口
  • 小范围代替全局变量:利用私有和特权成员,可以隐藏那些不应该被直接修改的数据