【问题标题】:The purpose of "Self Invoking Anonymous Functions" [duplicate]“自调用匿名函数”的目的 [重复]
【发布时间】:2012-06-05 14:23:20
【问题描述】:

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

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

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

【问题讨论】:

标签: javascript function anonymous-function


【解决方案1】:

根据我的个人经验,除了使用匿名函数来诱导作用域之外,我还在 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 的值并显示正确的计数。

【讨论】:

    【解决方案2】:

    是否只是为了防止变量等“污染”全局范围?

    差不多。封装和尽可能多地避免全局状态本身就是很好的目标。

    【讨论】:

    • 我觉得这更容易理解。
    【解决方案3】:

    就是创建自己的作用域。它不仅更好,因为您不再“污染”其他一些(例如全局)范围,它为您提供了保证名称冲突问题和防御程序员的安全性,这些程序员喜欢戳您的函数/对象/方法的内部在所有好处中。它还可以让 GC 轻松理解,当函数完成时,您不再需要任何引用的对象。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2014-09-11
        • 1970-01-01
        • 2012-02-23
        • 2013-02-23
        • 2013-04-16
        • 2013-08-29
        • 2012-10-12
        • 1970-01-01
        相关资源
        最近更新 更多