用parens包裹的功能

时间:2012-10-10 09:59:41

标签: javascript parentheses

为什么会返回语法错误:

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

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

但这有效:

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

请解释这些包装括号的用途。我被告知,parens习惯于“提高可读性”,但在这种情况下肯定有更多的目的。

关于使用about(),请详细说明一下吗?假设您要将这行代码翻译成散文,()读取的内容是什么?我也试图向其他人描述这个概念,并且需要传达其意义,以便每个人都能理解它。我试图回答的问题是()的意思是什么?它们是否具有语义价值,它是什么?

2 个答案:

答案 0 :(得分:6)

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

  

FunctionDeclaration

     

function 标识符 ( FormalParameterList opt { FunctionBody }

通过将其包装在括号中,您将其转换为函数表达式(匿名表达式)。您可以通过在:

之后添加一对调用括号来执行它
(function(foo){console.log(foo)})("hello"); //Will log 'hello'

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

  

FunctionExpression

     

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


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

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

  

PrimaryExpression

     

} 表达式 (

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

答案 1 :(得分:2)

这是因为没有()function(){}行是function declaration,而 ()expression }。

函数声明是一种奇怪的野兽,它们在代码执行之前在中定义的范围内随处可用,因此这样的片段有效:

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