functionf1(){var n =250;functionf2(){//f2定义在f1的内部,可以读取f1的局部变量;alert(n);}return f2;//返回f2的目的是外部可以调用f2函数,不至于因为f2函数定义在f1内部,而导致外部不能调用。这样就相当于f2还是可以在外部调用的,巧妙地,在f2里面使用了f1的局部变量。实现了上面代码同样的效果}
以上代码中f2就是闭包.f2里可以读取f1的局部变量.
以上代码调用f2有两种写法:
//方法一var f=f1();f()//方法二(f1())();
闭包的作用
可以读取函数内部的变量(局部变量)
可以让这些变量的值始终保持在内存中.
functionf1(){var n =1;functionf2(){
n++;alert(n);}f2();//在f1的作用域范围内调用f2,肯定能够显示出n的值,这是正常的。return f2;}var f =f1();//f是全局变量f();//但是,在f1之外调用f2时,也能正确显示出f1里给n赋的值,这就是使得变量n一直保存在内存中了。原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。