javascript中括号的功能是什么?

what's the function of parantheses in javascript?

本问题已经有最佳答案,请猛点这里访问。

我知道大多数人都使用以下脚本

1
(function(){})();

用于匿名函数调用。 但周围的parantheses的功能是什么?

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

有人可以帮我解释一下吗?


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

为了说明它,请参阅以下示例。

1
2
3
var x = 5; // works
var y = (5); // works
var z = (); // syntax error!

()用于JavaScript中的一些内容。

方法调用

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

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

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

1
(function(){})();

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

1
(function(){}());

表示该功能已分组,表达式是整体的一部分。这导致了另一个用例:

分组表达式

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

1
(1,2,3);

()将是语法错误。但这会奏效:

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

在你的例子中就是这种情况:

1
var g = (function(){});

g已被赋予匿名函数作为其值。这也有效:

1
var g = function() {};

同样的效果。

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

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

但这会奏效:

1
2
3
(function() {
    return 12;
}());

因为表达式被分组。


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

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

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

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

1
var f = function(){};

  • (function(){})();。这是一个立即调用的函数表达式(IIFE)。这是一种非常流行的模式,用于避免碰撞。看到这篇文章。

  • var g= (function(){})。这是一个有效的变量分配。实际上,在执行此语句之后,g变量包含该函数。我们试试这个:

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