根据我的个人经验,除了使用匿名函数产生作用域外,我还在for循环中使用它进行闭包。当DOM元素需要存储计数时,而您没有访问jQuery等库的权限时,这将非常有用。
假设您有100个 DIV
元素。单击第一个 DIV
元素应该弹出1,类似地,单击第56个div元素应该弹出56。
因此,在创建这些元素时,通常会执行以下操作:
// Assume myElements is a collection of the aforementioned div elements
for (var i = 0; i < 100; ++i) {
myElements[i].onclick = function() {
alert( 'You clicked on: ' + i );
};
}
这将会弹出99,因为计数器当前的值为99。这里并未维护i
的值。
然而,当使用匿名函数来解决问题时,
for (var i = 0; i < 100; ++i) {
(function(count){
myElements[count].onclick = function() {
alert( 'You clicked on: ' + count );
};
})(i);
}
这里维护了变量 i
的值,并显示了正确的计数。
这是为了防止在全局范围内污染变量等吗?
基本上是的。封装和尽可能避免全局状态本身就是很好的目标。
这是为了创建自己的作用域。这不仅更好,因为您不再“污染”其他(例如全局)作用域,而且它为名称冲突问题提供了可靠的逃逸和防御程序员太过于钻研函数/对象/方法内部的好处。它还允许垃圾回收器在函数完成时轻松理解您不再需要任何引用的对象。
for循环中的闭包也使用自执行匿名函数。
function attachEventsToListItems( ) {
var oList = document.getElementById('myList');
var aListItems = oList.getElementsByTagName('li');
for(var i = 0; i < aListItems.length; i++) {
var oListItem = aListItems[i];
// Watch this:
oListItem.onclick = (function(value) {
return function() {
alert(value);
}
})(i);
}
}