JavaScript闭包
为什么使用闭包?
- 从外部读取函数内部变量。
- 让变量的值始终保持在内存中。
function f1(){
var a = 99; // 局部变量
function f2(){
alert(a); // 99 对于函数f2来说 父对象f1中定义的变量都是可见的
}
return f2;
}
var result = f1();
result(); // 99
由于f1中的局部变量对于f2是可见的,所以将f2作为返回值返回,在f1外部就能读取到f1内部的变量,此时,函数f2就是闭包。
闭包就是能够读取其他函数内部变量的函数。由于在JavaScript语言中,只有函数内部的子函数才能读取局部变量,所以闭包可以简单的理解为一个定义在函数内部的函数。
一个疑问:在函数外部是否可以调用函数内部定义的函数?
在函数外部不能直接调用函数内部定义的函数,若要调用函数内部定义的函数,需要在函数外部先声明一个变量(全局变量),用变量来接收函数内部定义的函数的函数名,之后先调用外部函数,再调用内部函数即可。
var test; // 全局变量
function outFunc(){
var a = '我是局部变量';
function inFunc(){
alert(a)
}
test = inFunc // 用全局变量接收内部函数的函数名
}
// 先调用外部函数
outFunc();
// 再调用内部函数
test();
使用闭包需要注意:
- 由于闭包会使得函数中的变量一直存在内存中,对内存消耗很大,所以不能滥用闭包,否则会造成网页性能问题,在IE中可能内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
- 闭包会在父函数外部,改变父函数内部的值。