闭包定义&闭包的优点&闭包应用场景

278

1. 什么是闭包?

闭包是能够读取其他函数内部变量的函数。当函数的返回值是另一个函数,返回的函数调用了父函数的参数和方法,并且这个函数在外部被执行,那么这就会闭包。

2. 闭包的优点:

1. 通过闭包我们可以访问其他函数的内部变量。

在 js 执行时,会生成执行上下文,又叫执行环境。执行环境主要包括全局环境、局部环境。在执行上下文的创建阶段会生成作用域链、变量对象(VO variable object)、this。根据作用域链的就近原则,最里面的函数拿到当前作用域的变量以及父级作用域的变量,因此当把局部变量作为返回值进行接收时,外部就可以访问内部的变量。

2. 闭包创建私有作用域,私有化变量(重要)

闭包可以创建新的作用域,每个作用域都是独立的,互不干扰。用一个常见的问题举例,为什么 vue中的 data 是一个函数? 函数的设计就是一个闭包,vue 是一个单页面应用, 会有很多对应组件,每一个组件都有一个 data, 通过闭包给每个组件都创建了一个私有域空间。这样保证了每个组件都有一个私有的作用域, 若不用闭包,用常规对象设计,会导致各个组件中的数据会相互干扰。

3. 解决全局变量的命名冲突

在编写代码时,如果定义过多全局变量,可能会造成全局变量命名冲突,而闭包产生的私有化变量,不会污染全局环境。

4. 延长变量生命周期(重要)

JavaScript拥有自动的垃圾回收机制,关于垃圾回收机制,有一个重要的行为,那就是,当一个值在内存中失去引用时,垃圾回收机制会根据特殊的算法找到它,并将其回收,释放内存。而我们知道,函数的执行上下文,在执行完毕之后,生命周期结束,那么该函数的执行上下文就会失去引用。其占用的内存空间很快就会被垃圾回收器释放。可是闭包的存在,会阻止这一过程。通过闭包,变量会被存在内存当中,代码执行完之后,不会回收,以后的每一次调用都会在。

3. 闭包的缺点

1. 闭包可能会影响性能

闭包会使得函数中的变量都被保存在内存中,不会被回收,一旦循环引用,就会占据大量内存,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

2. 闭包会在父函数外部修改父函数内部变量的值

如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

4. 闭包的应用场景

1. 柯里化(偏函数)

2. 模块化

3. 防抖节流