我知道大多数人使用以下脚本,如
(function(){})();
用于匿名函数调用。但周围的parantheses的功能是什么?
var g = (); // syntax error, why?
var g= (function(){}); // correct
有人可以帮我解释一下吗?
答案 0 :(得分:5)
()
用于对表达式进行分组。当里面没有表达式时,它的语法错误。
为了说明它,请参阅以下示例。
var x = 5; // works
var y = (5); // works
var z = (); // syntax error!
答案 1 :(得分:1)
函数表达式的括号是使它成为表达式。
命名函数的语法太相似,函数表达式在没有括号的情况下工作:
function(){}();
^
|______ syntax error, function name expected
在使用函数表达式的其他情况下,已经知道它必须是一个表达式,例如:
var f = function(){};
答案 2 :(得分: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;
}());
表达式被分组。
答案 3 :(得分:0)
(function(){})();
。这是一个立即调用的函数表达式(IIFE)。这是一种非常流行的模式,用于避免碰撞。请参阅this article。
var g= (function(){})
。这是一个有效的变量分配。实际上,在执行此语句之后,g变量包含该函数。我们试试这个:
var g = (function(){console.log('hello')});
g();
var g = ();
。这不是语言规范的有效语法。有关详细信息,请参阅ECMAScript Language Specification。