什么是闭包
当一个函数内部再套用一个函数,便会存在闭包。内部的函数可以访问外部的函数中声明的参数和变量,即使外部函数已经终结。
闭包有什么特点
- 闭包可以让外部也能访问函数内部的值
- 内部的局部变量会一直存在在内存中,占用内存
- 全局变量重复使用,容易造成变量污染,但是局部变量不可以重复使用,只在局部作用域中有作用,所以不会造成变量污染
- 比普通函数更占内存,可能会导致内存泄露
内存泄露
内存泄露源自于一直被占用的内存无法被浏览器回收,如果被占用的内存又一直在分配资源的话,可能会导致内存空间不足,从而导致内存泄露。
由于闭包中的变量一直霸占着内存,内存从而不能被浏览器回收,所以一旦运行就会给内存造成泄露问题
解决内存泄露
- 将所有不适用的局部变量为Null
- 避免变量的循环赋值和使用
何时使用闭包比较好
闭包的结果是当前局部的父级函数中想对应的变量的最终的值。
- 封装功能时,可以使用闭包,因为闭包可以生成私有的属性和方法
- 函数防抖
- 函数节流
- 函数柯里化
- 给元素伪数组添加事件
函数防抖与函数节流
在开发中,我们经常遇到一些会持续触发的事件,但是又不希望频繁的去触发运行这些函数。此时,我们就可以利用函数的防抖和节流来进行处理。
防抖
防抖即事件在n秒内只能触发一次,但是如果在n秒内事件又触发了,将重新计算事件触发的时间。
函数防抖分为立即执行版和非立即执行版:
立即执行版:触发事件后会立即执行,但是在n秒后才能继续执行函数
非立即执行版:在触发事件的n秒后才会执行函数
节流
节流即可以连续的触发事件但是在n秒内只能执行一次函数。
函数节流分为时间戳版和定时器版:
时间戳版:持续触发事件,函数立即执行,每隔n秒会执行一次函数
定时器版:持续触发事件,函数不立即执行,再隔n秒后执行,最后一次触发之后还会再执行一次
函数柯里化
函数柯里化即为将有多个参数的函数转换成只有一个参数的函数,在返回剩下的参数以及返回结果的方法。最初的函数只有一个参数。
柯里化可以实现:
- 参数复用,可以反复的调用相同的参数
- 提前确认会走的方法
- 延迟运行