“自我调用匿名函数”的目的

时间:2012-05-31 10:22:36

标签: javascript function anonymous-function

  

可能重复:
  What is the purpose of a self executing function in javascript?

希望非常直截了当的问题:

使用自调用匿名函数的目的是什么?是否只是为了防止用变量等“污染”全球范围?或者使用它们还有其他优点吗?

4 个答案:

答案 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);
    }
}