可能重复:
javascript中自执行函数的目的是什么?
希望是一个非常直截了当的问题:
使用自调用匿名函数的目的是什么?是否只是为了防止变量等“污染”全局范围?或者使用它们还有其他好处吗?
根据我的个人经验,除了使用匿名函数来诱导作用域外,我还在 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
保持 的值并显示正确的计数。
是否只是为了防止变量等“污染”全局范围?
差不多。封装和尽可能多地避免全局状态本身就是很好的目标。
它是创建自己的范围。它不仅更好,因为您不再“污染”其他一些(例如全局)范围,它为您提供了保证名称冲突问题和防御程序员的安全性,这些程序员喜欢戳您的函数/对象/方法的内部在所有好处中。它还允许 GC 轻松理解当函数完成时您不再需要任何引用的对象。
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);
}
}