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垃圾回收机制。
路慢慢其休远羲,吾将上下而求所