JavaScript闭包

闭包是指有权访问另一个函数作用域中的变量的函数。      –from 高程3

举个例子

1
2
3
4
5
6
7
8
9
function makeFunc() {
var name = "Mozilla";
function displayName() {
alert(name);
}
return displayName;
}
var myFunc = makeFunc();
myFunc();

按照常理,函数在运行完毕后局部变量便会不可用。一旦makeFunc()函数执行之后,我们会很合理的认为name不可用,但事实并不是这样。

原因是myFunc变成一个闭包了。

闭包特点:1.闭包函数作用于window,只能取得包含函数中任何变量的最后一个值。2.由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

一个常见错误:在循环中使用闭包

See the Pen PGqRyx by abcdGJJ (@abcdGJJ) on CodePen.

可以看到,每次点击后弹出的都是第4个元素。这是为什么呢?

原因其实是onclick绑定了一个匿名函数形成一个闭包,而闭包只能访问最后一个值,所以结果都是4

我们可以通过一些方法来让它输出期望的结果

将变量i保存在每个li上

1
2
3
4
5
6
for (var i = 0; i < list.length; i++) {
list[i].index = i;
list[i].onclick = function() {
alert("第" + this.index + "个元素");
}
}

使用闭包

1
2
3
4
5
6
7
for (var i = 0; i < list.length; i++) {
list[i].onclick = (function(i) {
return fucntion() {
alert("第" + i + "个元素");
}
})(i);//定义一个匿名自执行函数(闭包),i为调用时的参数
}

使用事件代理