闭包的两个特点:
1、作为一个函数变量的一个引用,当函数返回时,其处于激活状态。
2、一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
概念描述(个人理解仅供参考):
当一个函数嵌套中又嵌套了其他的函数时,我们可以把它们叫做外层函数和内嵌函数。内嵌函数可以访问外层函数中定义的变量(局部变量)。假设内嵌函数用到了外层函数的变量,如果我们又把内嵌函数做为外层函数的返回值,让外界可以通过外层函数得到内嵌函数的引用,这时闭包就形成了。外界通过外层函数得到内嵌函数的引用之后,外层函数的职责就完成了,在传统语言中,这时会释放外层函数中定义的局部变量,但是在JavaScript闭包中不会!内嵌函数会锁定外层函数中的局部变量,直到外界对内嵌函数引用结束,才释放变量。闭包之所以能够实现根本是因为JavaScript是解释执行的,它会扫描整个代码,只要外界用到了内嵌函数,内嵌函数用到的外层函数的变量就不会释放,直到内嵌函数引用结束。说了这么多概念很抽象,再来个例子+完美注释就什么都明白了!
<script type="text/javascript"> function fun1() //fun1就是上边讲的外层函数 { var str = "我爱中国"; return function (){alert(str);};//定义一个匿名内嵌函数(我为了方便才匿名的),这个匿名函数 //用到了外层函数fun1的变量str,然后把str打印出来。注意return,这个匿名函数是fun1的返回值 } var fun2 = fun1();//fun2就是上边讲的外界(函数),在这fun2引用了fun1中的匿名函数 alert("外层函数执行完毕!"); fun2();//执行fun2,实际上就是执行内嵌的匿名函数 </script>
这个例子输出的结果是:“外层函数执行完毕!”、“我爱中国”。证明了fun1中的str局部变量并没有被释放。
实际应用:
由于我也是初学,还不知道闭包这个东东有什么用。。。。举不出实际应用的例子,不能再研究了,再研究就要挨骂了。。。但是应该有这么个环节,占个位吧!