1. 闭包的概念
- 简单理解为
所有的函数都是闭包; - 细化理解一下,闭包就是
读取外部变量的函数; - 再细化一下,可以理解为定义在一个
函数内部读取外部变量的函数。
函数读取外部变量:
var a = 1;
function f1() {
console.log(a);
}
f1(); // 1
注意:
- 函数内部声明的局部变量,函数外部无法读取;
- 子对象可以获取父级对象的变量,但是父级对象无法获取子对象的变量!
2. 闭包的用途
- 实现私有成员
- 保护命名空间
- 避免污染全局变量
- 变量需要长期驻留在内存中
下面介绍一下变量长期驻留在内存中的现象:
function f1() {
var a = 1;
function f2() {
console.log(a);
a++;
}
return f2;
}
var result_1 = f1();
console.log(result_1); //打印出来一看,原来是函数f2
result_1(); //1
result_2(); //2
//这时函数f2获得了f1的的变量a驻留在内存中,变成自己的内部的变量,不受外部的影响
var result_2 = f1();
result_2(); //1
result_1(); //3
注意:
- 由于闭包会使函数中的变量保存在内存中,对内存的消耗很大,不能滥用闭包,会引起性能的问题,在IE中可能导致内存泄露;
- 闭包会改变父函数内部变量的值。 例如:
function test() {
var a = 1;
return {
getA: function() {
return a;
},
setA: function(c) {
a = c;
}
}
}
var result = test();
result.getA(); //1
result.setA(5);
result.getA(); //5