闭包函数是可以调用父函数作用域的属性的函数。
javascript的属性作用域是可继承的函数作用域,即子函数能访问父函数作用域和全局作用域,反之则不行。
使用闭包可以打破这个限制。
function f1(){
var n=999;
nAdd=function(){n+=1}
function f2(){
console.log(n);
}
return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000
f2就是一个闭包函数,通过f2可以访问到f1中的变量n。
nAdd函数在f1中被赋值,但因为没有声明,所以是全局的。nAdd也是一个闭包,能够修改f1中的变量。
因为闭包引用父函数作用域中的属性,而闭包函数又被全局引用,所以父函数中被引用的属性不会被垃圾回收。也因此,闭包有可能造成内存泄漏。