首页 > 代码库 > JS闭包理解
JS闭包理解
接触JS很久了,一直对于闭包的概念不理解,因为平时很少会用到,所以找了一下资料看了一下,简单记一下笔记,不对之处望指正。
参考原文:http://www.jb51.net/article/24101.htm
先来看一个简单列子:
function f1(){
var v1=1;
function f2(){
v1++;
return v1;
}
return f2;
}
var f1pro=f1();
alert(f1pro());//-----2
alert(f1pro());//------3
对输出结果进行分析,如果我们忽略F2函数部分,那么我们会很容易判断为两次输出都是2,原因是因为v1是f1函数的局部变量,局部变量是会在函数调用结束以后被GC所自动回收的,所以第二次f1函数的调用结果与第一次f1函数的调用结果是没有关系的。
但是万万没想到的是,第二次结果是3! 为什么呢? 看上去v1被升级成为了全局变量。 其实事实和这种猜想是有所差别的。 事实上f2这个内部函数就是我们所说的闭包,而闭包的作用,有2个:1、访问函数内部的局部变量。2、将使用到的局部变量的值保存在内存中。 第一个很好理解,将函数看成一个class的话,就相当于类函数访问到类变量,理所应当。而输出结果为3,原因就在于f1是f2的父函数,而f2被赋给了一个全局变量(f1pro,因为f1返回的是f2函数,所以f1pro其实是指向了f2函数),依赖关系即:f1pro--》f2---》f1,根据JS的GC回收原理(如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收),那么在全局变量f1pro被释放之前,f1和f2函数都不会被垃圾回收机制(garbage collection)回收。
关于闭包的应用场景,我的理解是,当我需要让一个变量在函数外能够被操作,并且我不想这个变量暴露在外,被任何人任意操作的时候,就可以用到闭包,这个时候这个变量就只能按照闭包里函数的规则被获取和修改。
值得注意的是,由于闭包绕过了GC处理,所以滥用的话,是会降低JS执行效率,甚至造成内存溢出的。
JS闭包理解