3

为什么这会返回语法错误:

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

我希望这会返回函数的值,因此返回自身,而不是将其分配给任何东西,但我得到一个“SyntaxError: Unexpected token (”

但这有效:

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

请解释这些包装括号的用途。有人告诉我,parens 用于“增加可读性”,但在这种情况下,肯定有更多用途。

您能否进一步详细介绍 about () 的使用?假设您要将那行代码翻译成散文, () 读起来会是什么样子?我也在尝试向其他人描述这个概念,并且需要将其含义传递给每个人都可以理解它。我要回答的问题是()是什么意思?它们是否具有语义价值,它是什么?

4

2 回答 2

7

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

功能声明

function 标识符 ( FormalParameterList opt ) { FunctionBody }

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

(function(foo){console.log(foo)})("hello"); //Will log 'hello'

这是函数表达式的 gammar(现在标识符是可选的):

函数表达式

function 标识符opt ( FormalParameterList opt ) { FunctionBody }


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

在这种情况下,括号被解析为“分组运算符”。分组运算符的语法如下:

主要表达

( 表达 )

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

于 2012-10-10T10:02:40.500 回答
2

这是因为没有(),function(){}行是一个函数声明,而()一个表达式

函数声明是一种奇怪的野兽,它们在代码执行之前在它们定义的范围内随处可用,所以像这样的片段可以工作:

foo();
function foo() { console.log('foo'); }
于 2012-10-10T10:02:16.083 回答