关于闭包的问题

244 阅读3分钟

什么是闭包

当一个函数内部再套用一个函数,便会存在闭包。内部的函数可以访问外部的函数中声明的参数和变量,即使外部函数已经终结。

闭包有什么特点

  1. 闭包可以让外部也能访问函数内部的值
  2. 内部的局部变量会一直存在在内存中,占用内存
  3. 全局变量重复使用,容易造成变量污染,但是局部变量不可以重复使用,只在局部作用域中有作用,所以不会造成变量污染
  4. 比普通函数更占内存,可能会导致内存泄露

内存泄露

内存泄露源自于一直被占用的内存无法被浏览器回收,如果被占用的内存又一直在分配资源的话,可能会导致内存空间不足,从而导致内存泄露。

由于闭包中的变量一直霸占着内存,内存从而不能被浏览器回收,所以一旦运行就会给内存造成泄露问题

解决内存泄露

  • 将所有不适用的局部变量为Null
  • 避免变量的循环赋值和使用

何时使用闭包比较好

闭包的结果是当前局部的父级函数中想对应的变量的最终的值。

  • 封装功能时,可以使用闭包,因为闭包可以生成私有的属性和方法
  • 函数防抖
  • 函数节流
  • 函数柯里化
  • 给元素伪数组添加事件

函数防抖与函数节流

在开发中,我们经常遇到一些会持续触发的事件,但是又不希望频繁的去触发运行这些函数。此时,我们就可以利用函数的防抖和节流来进行处理。

防抖

防抖即事件在n秒内只能触发一次,但是如果在n秒内事件又触发了,将重新计算事件触发的时间。

函数防抖分为立即执行版和非立即执行版:

立即执行版:触发事件后会立即执行,但是在n秒后才能继续执行函数

非立即执行版:在触发事件的n秒后才会执行函数

节流

节流即可以连续的触发事件但是在n秒内只能执行一次函数。

函数节流分为时间戳版和定时器版:

时间戳版:持续触发事件,函数立即执行,每隔n秒会执行一次函数

定时器版:持续触发事件,函数不立即执行,再隔n秒后执行,最后一次触发之后还会再执行一次

函数柯里化

函数柯里化即为将有多个参数的函数转换成只有一个参数的函数,在返回剩下的参数以及返回结果的方法。最初的函数只有一个参数。

柯里化可以实现:

  • 参数复用,可以反复的调用相同的参数
  • 提前确认会走的方法
  • 延迟运行