14

有没有理由使用命名的自调用函数?

例如:

(function foo() 
{
     alert('Hello World! Named Self Invoking Function Here');
})();

就我的学习而言,这与匿名自调用函数的作用相同,没有额外的优点(您不能在调用后再次调用它),也没有额外的缺点,因为它不会“污染”全局范围(我认为)。

是否有任何时候命名像上面这样的自调用函数是有意义的?

4

6 回答 6

13

如果您需要一个递归的自调用函数,那么它可能是有意义的:

(function loop(i) {
    console.log(i);
    i++;
    if(i < 10) {
        loop(i);
    }
})(0);
于 2012-06-08T10:39:20.657 回答
9

我使用这种模式定期从服务器轮询数据。这使得代码不那么混乱(尤其是setTimeout行)。

(function poll() {
  $.get("/somedata", function (data) {
    // Processing data...
    setTimeout(poll, 1000);
  });
})();
于 2012-06-08T10:47:26.020 回答
3

这对递归很有用,但你应该暂时避免命名函数表达式。直到版本 9,它们才在 Internet Explorer 中得到正确支持。

请参阅:http: //javascript.info/tutorial/functions-declarations-and-expressions

“IE<9 不支持 NFE”

于 2012-06-08T10:49:26.427 回答
1

命名自调用函数可以提高可读性。例如,在您通过自调用函数创建多个闭包的情况下,通过提供名称,它可以无害地提高代码的可读性(除了失去旧的 IE 支持,如前所述)。本质上,您正在创建命名代码块,这可能是分解大型函数的好方法。

例如,

function bigFunction() {
   (function doTheFirstThing() {
      //code here.
   })();
   (function doTheSecondThing() {
     //code here.
   })(); 
}
于 2014-01-21T00:51:28.680 回答
0

您可以将其用于初始化,即您必须首先运行的代码行,然后它将调用另一个脚本。

于 2015-11-12T07:41:04.317 回答
0

它为我们提供了一种创建递归、自执行函数的方法。在下面的演示中,我创建了一个自执行函数,它递增一个计数器,记录它,然后递归地调用自身:

var counter = 0;
// Create a self-executing function block; however, rather
// than passing in an anonymous, headless function, let's
// pass in a named function.
(function useCounter() {
  // Increment and log counter.
  console.log(++counter);
  // Call *this* function again in after a short timeout.
  setTimeout(useCounter, 1000);
})(); // Self-execute.

自调用函数的另一个更常见的用途是数据隐私,其中包含的所有内容仅在这些函数的范围内可用。

有关更多详细信息,请访问https://en.wikibooks.org/wiki/JavaScript/Anonymous_functions

于 2019-09-25T06:45:54.890 回答