javascript匿名函数

时间:2011-10-15 18:33:55

标签: javascript

  

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

我想知道为什么双功能支架在功能的最后?

这里简单的匿名函数:

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

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

那些是为了什么?

6 个答案:

答案 0 :(得分:3)

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

foo();

其中foo表示匿名函数,该函数声明为内联,不能通过名称引用。

答案 1 :(得分:3)

这是一个自我执行的功能。这意味着它立即被取消。

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

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

答案 2 :(得分:1)

您的代码示例

(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

答案 3 :(得分:0)

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 "()")

所以,为了调用它,只需调用上面表达式的结果即可!你得到了一个匿名的自我执行功能。

答案 4 :(得分:0)

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


考虑function foo (){ ... }

如果你刚刚拥有它,它将无能为力。要调用foo,您需要参数列表(尽管为null)。所以foo()会执行。

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

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

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

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

答案 5 :(得分:0)

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

“技巧”是理解这适用于任何表达式,该表达式求值为 function-object ,并且函数名只是求值为函数-object 它代表。这是一个演示:

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中的新范围仅由新函数引入