likes
comments
collection
share

实际生产中的哪些地方出现了闭包的身影

作者站长头像
站长
· 阅读数 87

前情提要

闭包这个词相信大家早就听得耳朵都出茧子了,毕竟这除了在实际开发中会遇到,在面试中也是个高频考题。但是对于闭包的概念,相信部分同学都只是知道概念,却鲜有具体的实践案例。尤其是面试官问到在你开发过的项目中是如何应用闭包的时候,可能就会让你陷入沉思,思索良久却没有任何答案。那么,今天就从这个角度来讲讲实际生产中哪些用到了闭包。

首先我们先再复习一下什么是闭包?

  • 形式上就是一个函数返回一个函数。
  • 作用域上就是外层的函数创建一个单独的作用域,里面的函数可以随时随地的访问。并且外层函数创建的作用域中的被引用的变量不会被垃圾回收机制回收。这句话又可以翻译成:一个可以访问其他函数的内部作用域的函数叫闭包。
  • 以函数作为参数进行传递

实际生产中哪些方法是基于闭包实现的?

  • 防抖和节流
    • 我们比较常用的工具方法防抖和节流就是基于闭包实现的。熟悉防抖和节流内部实现原理的同学肯定秒懂。如果不了解的同学可以点击链接去看我之前写过的一篇防抖和节流的实现。
    • 用防抖来举例,其内部实现是在外层函数内部创建一个变量,用来存储定时器的实例。之后在内部函数里判断外层函数是否存在,存在的话就通过clearTimeout清除该实例,然后再将最新的定时器实例赋值给外层函数内实现的变量。
    • 示例:
      /**
      * @description 防抖
      * @param { function } 函数
      * @param { number } 等待的时间
      * @return { function }
      **/
      function debounce(fn, wait=500) {
         let timer;
         return function() {
             if (timer) clearTimeout(timer);
             timer = setTimeout(() => {
                 fn.call(this, ...arguments)
             }, wait)
      
         }
      }
      
  • 计时器setTimeout,定时器setIntervel,$nextTick......
    • 以上列举的方法,都会接收一个回调函数,把函数作为参数进行传递也是闭包的特性之一

什么时候要用闭包

  • 当你需要一个方法执行的时候共享某一个变量的时候
  • 当一个方法有多个参数,但是在某些场景下只部分参数都是一定的,其他的才是变动的时候
  • 当封装一些高级方法的时候

写在最后

  • 任何事物都是双刃剑。虽然闭包有它的好处,但是坏处也很明显,就是当外层方法调用完不再使用的时候,本应该被垃圾回收机制回收,但是由于其局部作用域的变量被引用,会导致无法被回收。当这种情况到达一定量的时候便会造成内存溢出。
  • 解决办法除了慎用闭包之外,就是在使用完成后将变量的值设置为null
转载自:https://juejin.cn/post/7091255662390280229
评论
请登录