您的位置:首页 > Web前端 > JavaScript

Javascript--闭包(closure)

2010-04-02 10:58 302 查看
第一篇文章

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

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

先给出一个简单的例子:

function a() {
var i = 0;
function b() {
alert(++i);
}
return b;
}
var c = a();
c();


函数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,这里就产生了闭包的效果。

再看一个例子

for (var i = 1; i < 4; i++) {
var id = document.getElementById("a" + i);
id.onclick = function() {
alert(i);
}
}


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

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

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

待续:有待理解更加深入的问题,javascript垃圾回收机制。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: