理解JS中的闭包

什么是闭包

简单来说,闭包就是能够读取其他函数内部变量的函数。

如果出于种种原因,需要得到函数内的局部变量。正常情况下,这是办不到的,只有通过变通方法才能实现。那就是在函数的内部,再定义一个函数。

由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成”定义在一个函数内部的函数”。

所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

1
2
3
4
5
6
7
8
9
function f1(){
var n=123;
function f2(){
console.log(n);
}
return f2;
}
var result = f1();
result(); // 123

上面代码中函数 f2 就是闭包,即能够读取其他函数内部变量的函数。

闭包的用途

闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

1
2
3
4
5
6
7
8
9
10
11
function increased(start) {
return function () {
return start++;
};
}

var inc = increased(5);

inc() // 5
inc() // 6
inc() // 7

上面代码中,start 是函数 incrementor 的内部变量。通过闭包,start 的状态被保留了,每一次调用都是在上一次调用的基础上进行计算。

闭包的另一个用处,是封装对象的私有属性和私有方法。