我想知道为什么双功能支架在功能的最后?
这里简单的匿名函数:
(function(){ ... })();
(function(){...})();
那些是为了什么?
答案 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中的新范围仅由新函数引入 。