"自执行匿名函数"的目的

8

可能是重复问题:
什么是JavaScript中自执行函数的目的?

希望这是一个非常简单的问题:

使用自执行匿名函数的目的是什么?它是否只是为了防止在全局范围内污染变量等等?还是有其他优点使用它们?


1
这也被称为IIFE。请参见 http://benalman.com/news/2010/11/immediately-invoked-function-expression/. - Mathias Bynens
4个回答

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 的值,并显示了正确的计数。


4

这是为了防止在全局范围内污染变量等吗?

基本上是的。封装和尽可能避免全局状态本身就是很好的目标。


我认为这样更易理解。 - Naveen DA

3

这是为了创建自己的作用域。这不仅更好,因为您不再“污染”其他(例如全局)作用域,而且它为名称冲突问题提供了可靠的逃逸和防御程序员太过于钻研函数/对象/方法内部的好处。它还允许垃圾回收器在函数完成时轻松理解您不再需要任何引用的对象。


0

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接