工作正常:
const foo = 1; // any number, string, bolean or object
(() => console.log('stuff'))()
但是没有分号是行不通的:
const foo = 1 // TypeError: 1 is not a function
(() => console.log('stuff'))()
嗯...
在第一个括号不能被解释为前一个指令的正确延续的情况下,是否应该将匿名函数的调用视为单独的指令?>
答案 0 :(得分:1)
是的,但这只是关于在语法上正确的延续。
1(() => console.log('stuff'))()
是一种语法正确的表达式,其解析为“使用参数1
调用() => console.log('stuff')
,然后调用不带参数的结果”。这会在运行时引发异常(1
不起作用,因此无法调用),但它仍然是有效的表达式。
答案 1 :(得分:1)
您应该始终使用分号。如果不添加它们,则Javascript会猜测将它们插入到哪里,并会导致错误。
在您的情况下,这说明您正在调用函数。
关于how semicolons are automatically inserted主题的精彩文章:
规范:解析器将每个新令牌视为当前令牌的一部分 语句,除非有分号将其终止。的 以下示例显示了您可能认为分号应包含的代码 被插入,但不是。这说明了忽略的风险 分号。
没有ASI:
a = b + c (d + e).print()
这不会触发ASI,因为在函数调用中,左括号可以跟在c之后。因此,以上是 解释为:
a = b + c(d + e).print();
答案 2 :(得分:0)
…当第一个方括号不能解释为上一条指令的正确延续时?
但是可以-如您所见,代码可以很好地解析并执行。当没有插入分号时,它将抛出运行时异常,对ASI来说无关紧要,它在解析时不知道。
答案 3 :(得分:0)
在javascript中,无论您有多少空格,它都只会被视为一个空格。
在第二个代码段中,它实际上等于:
const foo = 1 (() => console.log('stuff'))()
这意味着您调用一个名为'1'的函数并传递'()=> console.log('stuff')'作为参数。但显然1不是函数,所以它会引发错误,希望对您有意义