可能重复:
What is the purpose of a self executing function in javascript?
希望非常直截了当的问题:
使用自调用匿名函数的目的是什么?是否只是为了防止用变量等“污染”全球范围?或者使用它们还有其他优点吗?
答案 0 :(得分:11)
根据我的个人经验,除了使用匿名函数来引入范围之外,我还在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
的值并显示正确的计数。
答案 1 :(得分:4)
是否只是为了防止用变量等“污染”全局范围?
差不多。封装和避免尽可能多的全局状态本身就是好目标。
答案 2 :(得分:3)
创建自己的范围。它不仅更好,因为你不再“污染”其他一些(例如全局)范围,它为你提供了保证逃避名称冲突问题和程序员的防御,这些程序员喜欢在你的函数/对象/方法内部戳太多所有的好处之一。它还允许GC在功能完成时轻松理解您不再需要任何引用的对象。
答案 3 :(得分:0)
Closures in for-loops也使用自调用匿名函数。
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);
}
}