3

I know most of people using the following script like

(function(){})();

for anonymous function call. But what's the function of the surrounding parantheses?

var g = (); // syntax error, why?
var g= (function(){}); // correct

Can anybody explain it for me?

4

4 回答 4

5

()用于对表达式进行分组。当里面没有表达式时,它是一个语法错误。

为了说明这一点,请参见以下示例。

var x = 5; // works
var y = (5); // works
var z = (); // syntax error!
于 2013-05-28T09:14:28.953 回答
1

()用于 JavaScript 中的几件事。

方法调用

当用作运算符时,它将用于调用函数,可选地带有参数列表:

var a = function() { console.log(23); }
a() // => 23

当人们使用直接调用的匿名函数来创建闭包时,您可以看到这一点。就像你的例子一样:

(function(){})();

虽然我猜大多数人会这样写:

(function(){}());

表示函数是分组的,表达式是整体的一部分。这导致了另一个用例:

对表达式进行分组

()可用于对表达式进行分组。像这样:

(1,2,3);

()将是语法错误。但这会起作用:

a = (1,2,3);
console.log(a); // => 3

在您的示例中就是这种情况:

var g = (function(){});

g已被分配一个匿名函数作为它的值。这也可以:

var g = function() {};

一样的效果。

分组没有直接价值,但是当您考虑为闭包创建匿名函数时,它非常重要:

function() {
    // your code
}(); // => Syntax Error

但这会起作用:

(function() {
    return 12;
}());

因为表达式是分组的。

于 2013-05-28T09:29:09.887 回答
1

函数表达式周围的括号是为了使它成为一个表达式。

在这种情况下,命名函数的语法过于相似,以至于函数表达式无法在没有括号的情况下工作:

function(){}();
        ^
        |______ syntax error, function name expected

在使用函数表达式的其他情况下,已经知道它必须是一个表达式,例如:

var f = function(){};
于 2013-05-28T09:16:20.157 回答
0
  1. (function(){})();. 这是一个立即调用函数表达式 (IIFE)。这是一种非常流行的模式,用于避免碰撞。见这篇文章

  2. var g= (function(){}). 这是一个有效的变量赋值。实际上,执行完这条语句后,g 变量中就包含了函数。让我们试试这个:

      var g = (function(){console.log('hello')});
      g();
    
  3. var g = ();. 这不是语言规范的有效语法。有关详细信息,请参阅ECMAScript 语言规范

于 2013-05-28T09:19:04.023 回答