接触闭包之后,看了好多网上的资料,看的越来越头疼,看到阮一峰的这篇之后,觉得对闭包有了个清楚的理解,反过来再看以前看过的有关javascript的闭包的文章,觉得好理解都了。以下是看后几篇文章的笔记记录。
?
阮一峰的有关JavaScript闭包的理解
?
在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闭包的理解
?
JavaScript中所有的function都是一个闭包。只是当调用结束后,私有变量无法访问,并且没有外部引用存在,内部对象就会被销毁。
而如果返回了函数,或者被全局引用,这个闭包就保留下来了。这时候就是大部分时候我们所谓的“闭包”。
最简单的闭包例子如下:
function a() { ?
?? ?var i = 0; ?
?? ?function b() { ?
?? ? ? ?alert(++i); ?
?? ?} ?
?? ?return b; ?
} ?
var c = a(); ?
c(); ? ?
我们对闭包下个定义:当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个我们通常所谓的“闭包”。
?
ps:这篇文章最大的收获是通过对javascript回收机制来理解闭包。
?
?
JavaScript内核系列闭包
ps:这遍文章列了几个闭包的应用如匿名自执行函数,实现封装,缓存.
?
Javascript闭包
允许使用内部函数--即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。 当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。?
ps:这篇文章是给出闭包定义最概括性的并且又容易的理解的。