一、闭包的概念
JavaScript变量的作用域有两种——局部变量或全局变量,全局变量能够通过闭包实现局部(私有)。在JavaScript中我们可以在函数内部直接读取全局变量,但是在函数外部无法读取函数内的局部变量。
这时我们怎样才能从外部读取局部变量呢?
只要稍微变通一下即可。我们可以在在函数的内部再定义一个函数(代码如下):
function f1(){
var x = 0;
function f2(){
console.log(x);
}
return f2;
}
var ff = f1();
ff();
f2函数在函数f1内部,此时f1内部所有局部变量对f2都是可见的,但是f2内部的局部变量对f1是不可见的(链式结构:子对象会一级一级地向上寻找所有父对象的变量)。我们在上述代码中将f2作为返回值,就达到了在f1外部读取它内部变量的效果。
上述代码中的f2函数就是一个闭包,简单来说,闭包就是能够读取其他函数内部变量的函数。也就是说,闭包就是将函数内部和函数外部连接起来的一座桥梁。
二、闭包的用途
①可以在函数外部读取函数内部变量
②可以让函数变量值始终保持在内存中
function f1(){
var x = 0;
f3 = function(){x+=1}
function f2(){
console.log(x);
}
return f2;
}
var ff = f1();
ff(); //0
f3();
ff(); //1
f3();
ff(); //2
上面我们可以看出f2是一个闭包函数,我在外部定义的ff实际上就是f2函数,我们在代码中让它运行了三次,运行结果分别是0,1,2,可以说明f1地局部变量x始终保存在内存中,没有在f1调用后被自动清除。
三、使用闭包注意点
- 由于闭包会使得函数中的变量一直被保存在内存中,内存消耗很大,所以闭包的滥用可能会降低程序的处理速度,造成内存消耗等问题。
- 解决方法:在退出函数之前,将不使用的局部变量全部删除。