相信很多从事js开发的朋友都或多或少了解一些有关js闭包(closure)的知识。
本篇文章是从小编个人角度,简单地介绍一下有关js闭包(closure)的相关知识。目的是帮助一些对js开发经验不是很多的朋友,使他们可以简单的了解一下js闭包(closure)。
下面言归正传,请大家和我一起来学习一下js闭包(closure)。
1.什么是闭包?
官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
相信很多朋友对这种解释非常反感,因为看完以后根本不知道它想表达什么。
请阅读下面代码,然后让小编告诉你小编自己的理解。
1 function f1(){ 2 var n=123; 3 function f2(){ 4 alert(n); 5 } 6 return f2; 7 } 8 var result=f1(); 9 result(); // 123
上面代码中f2方法就是闭包。
代码中n是f1方法的局部变量,无法再方法外部获得。因为f2同样在f1方法内部,所以f1的内部所有变量对f2都是可见的,这时只要把f2作为返回值,我们就可以在f1外部读取到f1的局部变量。
注意:f1中局部变量对f2是可见的,但是f2中局部变量对f1则是不可见的。这就是javascript语言的链式作用域(chain scope)。
所以小编理解,闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。
作用上讲,闭包是将函数内部与函数外部连接起来的一座桥梁。
2.闭包的用途:
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。
闭包有两个非常大的用途:
一、就是上面介绍的js闭包(closure)可以让方法内部的局部变量变得可以在方法外部读取;
二、js闭包(closure)可以这些变量值始终保持在内存中。
怎么来理解js闭包(closure)的第二个用途呢?代码是最通用的语言
function f1(){ var n=123; nAdd=function(){n+=1} function f2(){ alert(n); } return f2; } var result=f1(); result(); // 123 nAdd(); result(); // 124
上面代码result()方法执行两次,第一执行n值为123,第二次执行n值为124。这说明f1方法中局部变量n一直保持在内存中。
那么上面现象原因是什么呢?
原因是f1返回值为f2,f2被赋值给变量result,result在内存中导致f2也始终在内存中。同时f2是f1的局部方法,f2在内存中导致f1也始终在内存中。这就导致f1没有在调用结束后被垃圾回收机制(garbage collection)回收。
通过上面的介绍,大家有没有对js闭包(closure)有了简单的认识呢?
当然本篇文章只是对js闭包(closure)的简单介绍,如果想深入理解js闭包(closure)还是需要读者朋友们深入研究的。
如果读者朋友们还有对js闭包(closure)不了解的地方,也欢迎大家在评论区一起探讨,也可以直接给我发邮件。
***************************
非常感谢读者朋友们对小编的支持,小编非常开心可以和大家分享我的开发经验。
如果我的经验可以帮助到读者朋友们,是小编最大的动力和荣幸。
2014/11/28 09:57
***************************