Javascript 命名自调用函数

Javascript 命名自调用函数,javascript,self-invoking-function,Javascript,Self Invoking Function,是否有理由使用命名的自调用函数 例如: (function foo() { alert('Hello World! Named Self Invoking Function Here'); })(); 据我所知,这与匿名自调用函数的作用相同,没有额外的优点(调用后不能再次调用),也没有额外的缺点,因为它不会“污染”全局范围(我认为) 有没有像上面这样命名一个自调用函数的时候是有意义的?如果您需要一个递归自调用函数,那么它可能是有意义的: (function loop(i) {

是否有理由使用命名的自调用函数

例如:

(function foo() 
{
     alert('Hello World! Named Self Invoking Function Here');
})();
据我所知,这与匿名自调用函数的作用相同,没有额外的优点(调用后不能再次调用),也没有额外的缺点,因为它不会“污染”全局范围(我认为)


有没有像上面这样命名一个自调用函数的时候是有意义的?

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

(function loop(i) {
    console.log(i);
    i++;
    if(i < 10) {
        loop(i);
    }
})(0);
(函数循环(i){
控制台日志(i);
i++;
如果(i<10){
回路(i);
}
})(0);

我使用此模式定期轮询来自服务器的数据。这会减少代码的混乱(尤其是
setTimeout
line)


这对于递归很有用,但是您应该暂时避免使用命名函数表达式。只有在版本9之前,Internet Explorer才正确支持它们

见:


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

e、 g


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

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

var计数器=0;
//创建一个自动执行的功能块;但是
//而不是传递一个匿名的无头函数,让我们
//传入一个命名函数。
(函数useCounter(){
//增量和日志计数器。
console.log(++计数器);
//在短时间超时后再次调用*this*函数。
设置超时(使用计数器,1000);

})();//自执行。
这是一个命名函数表达式,因此使用命名函数表达式的任何理由都适用。典型的例子是递归:
(函数fib(n){返回n可能是因为其中的代码使用了函数名?(相关)下面是一个稍微复杂的示例,在调试时可能会有所帮助:。调用堆栈当前显示
b-(匿名函数)
;如果你给它起一个名字,它会说
b-a
或类似的东西。顺便说一句,使用Y combinator可以实现它,而无需命名函数。@penartur-你有演示吗?@JaredFarrish举个例子,看看这个(缩小的)fibbonacchi数字计算函数:它没有说“不支持”,而是说“不支持”如果你知道这些怪癖并且知道它不会真正影响你(大多数情况下都是这样),你仍然可以使用它们而不会崩溃。必须阅读以下主题:@Bergi:我没有说“不支持”,我说的是“不正确支持”“。如果你想拆分hears,这里当然有支持和实现的区别,但如果没有正确实现,就会产生不正确支持的效果。无论如何,我的英语措辞对于拆分hears来说太糟糕了,对不起:-/但我不是指你说的,而是指你给出的那句话。@Guffa一旦你说了“不受支持”到此结束。不受支持是不受支持的。您试图添加到其中的任何内容都不会应用于它的明确含义。这与您在函数体的第一行写入return相同。:)在这一点上,所有浏览器都有一定程度的误解。关键字函数是一个提升器,就像var声明一样。所以…,你这样想吧。IEFEs似乎有点过火了。只有在你需要闭包(用于作用域/垃圾收集)时才使用它们,其他任何评论(可能)都可以使用它们“这就足够了。”本·罗伯茨听说过JavaScript标签吗?
(function poll() {
  $.get("/somedata", function (data) {
    // Processing data...
    setTimeout(poll, 1000);
  });
})();
function bigFunction() {
   (function doTheFirstThing() {
      //code here.
   })();
   (function doTheSecondThing() {
     //code here.
   })(); 
}