Javascript--闭包(closure)

第一篇文章

 

在网上搜了好久这方面的知识,才找到一些资料,通过阅读发现,闭包确实很重要。

定义:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

先给出一个简单的例子:

函数a(): 里面定义了一个b函数,而函数a()的返回值是b函数。

 

调用关系:定义一个c变量直接调用a函数,而a函数返回的是b函数,所以此时相当于:var c = a.b();

然后再调用c(), 就相当于调用a.b(); 此时会alert什么呢? 答案是1。

 

解析:在javascript里面如果一个变量没有别调用的时候会被垃圾回收器回收掉,而这里函数a()里面的i是一个局部变量,所以在执行完var c = a();之后应该会被回收掉,但是这里却没有,这就是因为在a()函数里面的b()函数又调用了这个i,这里就产生了闭包的效果。

 

再看一个例子

这个例子会alert出什么呢?答案是3个4。

解析:在定义了局部变量i之后,在这个for循环里面也存在一个匿名函数,去访问外部的局部变量,所以此时,这个i就不会被垃圾回收器回收,而循环完成之后,i的值一直都是4,所以在点击元素的是后就会都是4。

 

个人理解:就是在函数的函数里面调用外层函数定义的局部变量,而此时局部变量不会被回收,而是一直都存在。

 

待续:有待理解更加深入的问题,javascript垃圾回收机制。

posted @ 2010-04-02 10:58  我是小菜鸟  阅读(155)  评论(0编辑  收藏  举报