在javascript函数内部可以直接读取全局变量,而在函数外部自然无法读取函数内的局部变量。
只有函数内部的子函数才能读取局部变量,这个函数内部的子函数就是闭包。
简单的点说,闭包就是定义在一个函数内部的函数。当然闭包的形式不只只有这一种,但是这是大多数时候的情况。
闭包的作用:它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
第二点举个例子说明下:
function f1(){
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000
为什么内部变量会保持在内存中呢?原因就在内部子函数f2是一个全局变量,这导致该子函数f2始终在内存中,而该子函数f2的存在依赖于其父函数f1,
因此父函数f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
ps:从闭包的作用来理解闭包
JavaScript中所有的function都是一个闭包。只是当调用结束后,私有变量无法访问,并且没有外部引用存在,内部对象就会被销毁。
而如果返回了函数,或者被全局引用,这个闭包就保留下来了。这时候就是大部分时候我们所谓的“闭包”。
最简单的闭包例子如下:
function a() {
var i = 0;
function b() {
alert(++i);
}
return b;
}
var c = a();
c();
我们对闭包下个定义:当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个我们通常所谓的“闭包”。
ps:这篇文章最大的收获是通过对javascript回收机制来理解闭包。
ps:这遍文章列了几个闭包的应用如匿名自执行函数,实现封装,缓存.
允许使用内部函数--即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。 当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。
ps:这篇文章是给出闭包定义最概括性的并且又容易的理解的。