【问题标题】:javascript anonymous function [duplicate]javascript匿名函数[重复]
【发布时间】:2011-10-15 18:33:54
【问题描述】:

可能重复:
What does this JavaScript snippet mean?

我想知道为什么函数末尾有双括号?

这里是简单的匿名函数:

(function(){ ... })();

(function(){ ... })();

这些是干什么用的?

【问题讨论】:

标签: javascript


【解决方案1】:

这声明了一个匿名函数并在同一行立即调用它。把它想象成:

foo();

其中foo 表示一个匿名函数,它被声明为内联并且不能被名称引用。

【讨论】:

  • 谢谢,我会尽快将其标记为已回答。
【解决方案2】:

这是一个自执行函数。这意味着它会立即执行。

function anon() {
    alert('called');
}
anon(); // alerts at this time

(function () {
    alert('called');
})(); // alerts at this time, calls itself

【讨论】:

    【解决方案3】:

    您的代码示例

    (function(){ ... })();
    

    可以改写为

    anonymous = function () { ... };
    (anonymous)();
    

    或者,避免冗余第一个大括号对,如

    anonymous = function () { ... };
    anonymous();
    

    以将名称引入(此处为全局)名称空间为代价。

    正如前面 pst 所指出的,这个构造是用来创建一个新的作用域的。它与闭包结合使用最有用,例如实现无处不在的计数器:

     var counter = function (initval) {
       var c = initval || 0;
       return function () {
        var r = c;
        c += 1;
        return r;
       };
    } (5);
    
    counter () ; // 5
    counter () ; // 6
    counter () ; // 7
    

    【讨论】:

      【解决方案4】:
      function e(){} // function statement, parsed before runtime, can't be anonymous
      
      var e = function (){}; // function expression, parsed at runtime
      
      (function(){}()}); // function expression (evaluated at runtime by the enclosing "()")
      

      所以,为了调用它,只需调用上述表达式的结果,瞧!你给自己一个匿名的自执行函数。

      【讨论】:

      • 函数语句和函数表达式同时被“解析”。不同之处在于 [real] 函数语句被“提升”到当前函数(或函数外的脚本)的顶部。
      • 我认为你有一个错字
      【解决方案5】:

      它声明并调用/执行函数。


      考虑function foo (){ ... }

      如果你只是拥有它,它不会做任何事情。为了调用foo,您需要参数列表(尽管为空)。所以foo() 会执行。

      同样的事情也适用于匿名函数。但是,如果你有一个匿名函数,比如function (){ ... },你怎么称呼它?您没有指向它的变量。没有结尾 () 它只是一个定义,而不是一个调用,所以你必须在最后添加括号,只有你不能做 function (){ ... }() 因为操作顺序和 JavaScript 的解释方式。因此,您还需要将定义括在其自己的括号 (function (){...}) 中。通过调用,它看起来就像您发布的 (function (){...})()

      请注意,您也可以类似地定义函数,例如:

      var foo = function (){...};
      

      本质上是创建一个匿名函数并将其分配给一个变量。然后,您可以像使用任何其他功能一样执行foo()

      【讨论】:

        【解决方案6】:

        expression (...) 形式中,() 是函数应用运算符。它接受左边的表达式,它必须是一个函数对象并调用它,传入提供的参数,如果有的话。 (() 的另一种用法是优先级,其中包括(expression-that-evaluates-to-a-function-object)。)

        “诀窍”是理解这适用于 any 表达式,其计算结果为 function-object 并且函数名仅计算为 function -它代表的对象。这是一个演示:

        function f1 () { return 1 }
        typeof f1     // function
        f1()          // 1
        var f1b = f1  // f1 evaluates to a function-object which is assigned to f1b
        f1b()         // 1
        var f2 = function () { return 2 }
        typeof f2     // function
        (((f2))())    // 2 -- only one of the sets is the application operator
        typeof (function () {})       // function
        (function () { return 3 })()  // 3 -- any function-object can be applied
        

        编码愉快。


        使用自调用匿名函数的一个原因是“创建一个新范围”。 JavaScript 中的新作用域由新函数引入。

        【讨论】:

          猜你喜欢
          • 2013-11-22
          • 2015-02-19
          • 2013-12-18
          • 2012-02-23
          • 1970-01-01
          • 1970-01-01
          • 2013-08-29
          • 2016-03-27
          • 1970-01-01
          相关资源
          最近更新 更多