为什么 "true && () => {}" 会导致 "未捕获的语法错误:箭头函数参数列表格式不正确"?

18

执行以下代码时,

true && () => {}
产生 (yields)
Uncaught SyntaxError: Malformed arrow function parameter list
为什么? 编辑:我知道将函数用括号括起来可以解决问题,谢谢大家,但我想知道为什么解析器一开始无法识别它是一个函数。

2
true && (() => {}) 应该可以工作。 - Titian Cernicova-Dragomir
这与解析器有关,但我不确定它是如何被解析而导致失败的。 - ziggy wiggy
这是V8中报告解析错误的位置:https://github.com/v8/v8/blob/4b9b23521e6fd42373ebbcb20ebe03bf445494f9/src/parsing/parser.cc#L2226-L2229 - Trevor Dixon
3个回答

12
由于第一部分 true || (a) 先被单独解析,然后解析器试图解析剩下的部分 => {},导致了错误的发生。

1
起初,解析器会解析一个空的括号集合似乎让我感到惊讶,但我猜测一个空的括号集合可以被有效地解析,因为它可能是一个函数调用。 - ziggy wiggy

1

它将 true && () 解析为参数列表。


为什么在这个上下文中会出现错误:const r2 = await () => !r1.canceled && fsp.readFile('./config.json', 'utf8')?有任何想法吗? - oldboy

-1

由于箭头函数具有特殊的解析规则。请参见官方文档解析顺序段落。


1
只有在需要返回一个值时才使用return。不包含return语句不会导致语法问题。 - ziggy wiggy
@ziggywiggy 你是对的,不是 body 块,而是解析顺序,正如我已经链接的官方文档所述。回答已编辑。 - Davide Vitali
1
MDN不是“官方文档”。无论如何,这现在是一个仅包含链接的答案 - 您应该在答案本身中包含主要要点。 - JJJ

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