通俗理解之JS -- 闭包

74 阅读2分钟
1、概念

引用MDN中较为通俗的理解:闭包是一个函数,它让开发者可以从内部函数访问外部函数的作用域。在 JavaScript 中,闭包会随着函数的创建而被同时创建。

2、理解

现在通过一个例子来理解闭包:

function Func() {
    let a = 1
    function add() {
       console.log(a++);
    }
    return add
}
var func1 = Func()
console.log('func1',func1)
func1()
func1()
var func2 = Func()
func2()

运行结果为:

fd5c89b58a29bcc85281d1cd0960331.png
在这个例子中,我们定义了Func()函数,它定义了一个变量a与add()函数,并且返回的add()函数。从本质上讲,Func() 是一个函数工厂 ,他未来能够创建无数的不同词法作用域的add()函数。在上面的示例中,我们使用函数工厂创建了两个新的add()函数 。
但这里有一个需要解释的地方就是,在js中,函数里面的变量的作用域属于函数作用域,而在同个作用域下的函数作用域之间是不能访问的,函数作用域会在函数执行完后被清理,内存也随之回收,因此函数的变量也会被清除。但在上述例子中Func()中的变量却得到保存,这就是闭包的作用所在,Func()中的return的add()就是一个闭包,由于闭包是建立在函数内部的子函数,且可访问上级作用域的原因,所以即使上级函数执行完,作用域也不会被销毁,使得能够缓存上级作用域。使得函数外部和函数内部搭建桥梁。
以上就是对闭包原理的基本了解!

3、 用途与特点
  •  可以访问函数内部的变量
  •  变量长期驻扎在内存中
  • 避免全局变量的污染
4、 缺点

闭包是常驻的内存,会增加内存的使用量,使用不当很容易造成内存泄露。当不使用时,将创建出来的函数赋值为null,即可回收闭包。

参考文献

[1](javascript闭包详解 - 知乎 (zhihu.com))
[2](闭包 - JavaScript | MDN (mozilla.org))