JS基础巩固系列:【2】闭包

什么是闭包

函数A内部有一个函数B,函数B可以访问到函数A中的变量,那么函数B就是闭包。我个人的理解是:闭包就是能够读取其他函数内部变量的函数,并不需要return一个函数。

1
2
3
4
5
6
7
8
function A() {
let a = 1
window.B = function () {
console.log(a)
}
}
A()
B() // 1

闭包的作用

根据闭包的概念,我们可以理解到闭包最重要的作用就是可以将函数内部和函外部链接起来,他的作用有两处,一个是可以读取函数内部的变量,另一个是让这些变量的值始终保持在内存中,我们用一段代码来解释这两点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function f1(){
var n = 999;
nAdd = function(){
n+=1;
}
function f2(){
console.log(n)
}
return f2;
}

var result = f1();
result(); //999
nAdd();
result(); //1000

  1. 首先函数f1执行后将f2赋给了全局变量result,而函数f2在函数f1内部,所以在f2的内部可以访问到f1的变量n。
  2. 因为f2的存在依赖了f1中的变量n,所以使得f1也始终被存储在了内存中,在调用之后,不会被垃圾回收机制回收。(内部函数引用了位于外部函数的变量,当外部函数调用完毕后,这些变量在内存不会被释放,因为闭包需要它们)

使用闭包的注意点

由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。