【问题标题】:function wrapped in parens包裹在括号中的函数
【发布时间】:2012-10-10 09:59:41
【问题描述】:

为什么会返回语法错误:

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

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

但这有效:

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

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

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

【问题讨论】:

  • 在第一个示例中缺少标识符。在第二个示例中,当您使用括号包装时,您正在创建一个表达式函数

标签: javascript parentheses


【解决方案1】:

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

函数声明

function 标识符 ( FormalParameterListopt ) { FunctionBody } p>

通过将它包裹在括号中,您可以将它变成一个函数表达式(一个匿名的)。您可以通过在后面添加一对调用括号来执行它:

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

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

函数表达式

function 标识符opt ( FormalParameterListopt ) { FunctionBody }


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

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

PrimaryExpression

( 表达式 )

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

【讨论】:

  • 谢谢詹姆斯!但我仍然缺少关于 () 的部分。他们似乎拥有神秘的力量,能够改变操作的优先级 (1+1)*2 并且能够将声明更改为表达式。我如何区分这两种情况?是否有赠送特性,或者这是如何工作的?
  • @user436118 - 不客气 :) 检查我的编辑,我添加了一些关于括号如何将声明转换为表达式的内容。
  • 因此,本质上, () 将其中的任何内容转换为表达式,并将其组合在一起。这是要点吗?
  • @user436118 - 是的,只要可以根据语法将其解析为表达式即可。例如,(var a) 将失败,因为var 是一个语句,而不是一个表达式。函数可以解析为表达式,因此是允许的。
【解决方案2】:

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

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多