18

很简单,为什么有些 js 文件(例如 Ember 或 JQuery.js)以 开头(function() {...})();

4

2 回答 2

20

这种形式的代码(function() { /* code here */ })()被称为“立即调用函数表达式”。它经常用于设置闭包,因此您可以在不污染全局范围的情况下定义变量。由于这个原因,您可以在 Ember、jQuery 和几乎所有其他“插件”中找到它。污染全局范围通常是一个坏主意,但对于必须在所有站点上运行的插件,确保它不会意外覆盖站点创建者正在使用的变量尤为重要。

当然,还有其他用途。例如,它可以用来“锚定”一个迭代变量,如下所示:

for( i=0; i<links.length; i++) {
    (function(i) {
        links[i].onclick = function() {alert(i);};
    })(i);
}
// without the IIFE, all links would alert the value of links.length instead.

在某些情况下,我偶尔会使用大多数人可能会私刑我的 IIFE,例如“即时”计算:

if( (function() {
      var party=document.getElementById('party').children, l=party.length, i, r=0;
      for( i=0; i<l; i++) if( party[i].children.length > 0) r++;
      return r;
  })() == 6) {
    // your Party is full
}

如果在跳入语句之前进行计算,上述情况会好得多if,所以......不要像我在这个上做的那样!

于 2013-10-10T13:33:09.407 回答
7

语法以

(function(){
  /* code */ 
}());

称为立即调用的匿名函数,该函数在最后一行代码之后立即执行。用于确定其他函数的变量范围。

更多信息: http ://en.wikipedia.org/wiki/Immediately-invoked_function_expression

于 2013-10-10T13:31:13.550 回答