“(function(){})();”和“function(){}();”之间的区别是什么?

38

你能提供更多的上下文吗? - Jesse Pepper
为什么VIM不能处理括号?如果VIM无法处理这种情况,我很惊讶有那么多人在使用它。 - recursive
是的,JavaScript语法高亮会在括号之间的整个代码块中被禁用。 - Luca Matteis
7
在上面展示的例子中,没有区别,因为解析器在等号后面期望一个表达式。当你不把输出赋值时,你需要括号来消除函数声明和函数表达式之间的歧义。这些括号将解析器放置到一个表达式上下文中。 - Sean McMillan
3个回答

45

Peter Michaux讨论了An Important Pair of Parens中的区别。

基本上,括号是一种约定,用于表示紧随其后的是一个立即调用的函数表达式,而不是一个普通函数。特别是如果函数体很长,这会减少意外情况。


10

额外添加的一组括号使得你正在构造函数并执行它更加清晰。这是一种编码风格,而非功能性问题。


3
没有括号,包含函数表达式的单个语句会导致语法错误。 - Tim Down
2
OP提供的两个示例都是函数表达式,即使删除了括号也不会出现语法错误。只有函数声明才会出错。 - bryantsai
@bryantsai:你说得有道理,因为OP的例子(后来添加)使用了函数表达式作为赋值的一部分,因此不需要括号,但问题更普遍,这个答案是误导的。另外,我对你在提到函数声明时的建议感到困惑。 - Tim Down
1
我猜标题有点不一致,关于楼主的两个例子。然而,从问题内容以及前两个答案来看,我觉得它们是正确的。另外,我提到函数声明的意思是,只有在函数声明中使用括号时,它才有意义。函数声明不能立即调用。但是如果“分组”在括号内,函数声明就变成了函数表达式,因此可以立即调用。我的意思是,楼主的两个例子都是函数表达式,因此有无括号没有区别。 - bryantsai
好的,我明白了。但我的观点仍然成立:仅由函数表达式组成的语句(例如 function() { alert("1"); })是语法错误。 - Tim Down
在这方面没有人不同意您。实际上,没有人谈论语句,原帖明确将它们用作表达式。 - Henk

4
function(){}();

大多数浏览器都无法正常工作。您应该在函数周围使用括号以执行它。

(function(){})();

那么浏览器将知道最后一个括号应该应用于整个表达式。
function(){}
更新: 如果您不使用括号,浏览器可能会误解您。如果您只调用函数并忽略结果。
function() {
    alert(1);
}();

然后ff和ie会抛出错误。


5
如果它是函数表达式,那么function(){}();在所有浏览器中都能工作。特别地,var foo = function(){}(); 是可行的。 请阅读http://yura.thinkweb2.com/named-function-expressions/#expr-vs-decl 了解更多信息。 - user123444555621

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接