Javascript 包装在parens中的函数

Javascript 包装在parens中的函数,javascript,parentheses,Javascript,Parentheses,为什么会返回语法错误: function(foo){console.log(foo)} 我希望它返回函数的值,从而返回它自己,并且不将它分配给任何东西,但是我得到了一个“SyntaxError:Unexpected token(” 但这是可行的: (function(foo){console.log(foo)}) foo(); function foo() { console.log('foo'); } 请解释一下这些括号的作用。我听说括号是用来“增加可读性”的,但在这种情况下肯定有更多

为什么会返回语法错误:

function(foo){console.log(foo)}
我希望它返回函数的值,从而返回它自己,并且不将它分配给任何东西,但是我得到了一个“SyntaxError:Unexpected token(”

但这是可行的:

(function(foo){console.log(foo)}) 
foo();
function foo() { console.log('foo'); }
请解释一下这些括号的作用。我听说括号是用来“增加可读性”的,但在这种情况下肯定有更多的作用


你能更详细地介绍一下关于()的用法吗?假设你要把那行代码翻译成散文,那么()读起来会是什么样的呢?我也在尝试向其他人描述这个概念,并且需要传递它的含义,以便每个人都能理解它。我试图回答的问题是,()这是因为如果没有
()
,则
函数(){}
行是一个,而带有
()
行是一个

函数声明是一种奇怪的工具,在代码执行之前,它们在定义的范围内随处可见,因此类似这样的代码段可以工作:

(function(foo){console.log(foo)}) 
foo();
function foo() { console.log('foo'); }

第一个示例是函数声明。它没有标识符,这是一个语法错误。请注意,标识符不是可选的:

功能声明:

function
Identifier
FormalParameterListopt)
{
FunctionBody
}

通过将其包装在括号中,可以将其转换为函数表达式(匿名表达式)。可以通过在以下内容之后添加一对调用括号来执行:

(function(foo){console.log(foo)})("hello"); //Will log 'hello'
下面是函数表达式的gammar(现在标识符是可选的):

函数表达式:

函数
Identifieropt
FormalParameterListopt)
{
FunctionBody
}


括号如何将函数声明转换为函数表达式

在本例中,括号被解析为“”。分组运算符的语法如下所示:

主要表达:

表达式


分组运算符只能包含表达式,因此将函数解析为表达式而不是声明(显然,在您的确切示例中,函数不能是声明,因为它没有标识符).

在第一个示例中,缺少标识符。在第二个示例中,当您使用paren包装时,您正在创建表达式函数。谢谢您,James!但我仍然缺少关于()的部分。它们似乎具有不正确的权限,能够更改操作的优先级(1+1)*2和能够将声明更改为表达式。我如何区分这两种情况?是否存在泄露特征,或者这是如何工作的?@user436118-不客气:)检查我的编辑,我添加了一些关于括号如何将声明转换为表达式的内容。因此,本质上,()将其中的任何内容转换为表达式,并将其分组。这就是要点吗?@user436118-是的,只要能根据语法将其解析为表达式。例如,
(var a)
将失败,因为
var
是语句,而不是表达式。函数可以解析为表达式,因此它们是允许的。请检查标准中标题为“关于括号的问题”的部分