(()=> true)()之前的分号

时间:2018-09-30 18:26:52

标签: javascript

工作正常:

const foo = 1; // any number, string, bolean or object
(() => console.log('stuff'))()

但是没有分号是行不通的:

const foo = 1 // TypeError: 1 is not a function
(() => console.log('stuff'))()

嗯...
在第一个括号不能被解释为前一个指令的正确延续的情况下,是否应该将匿名函数的调用视为单独的指令

4 个答案:

答案 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不是函数,所以它会引发错误,希望对您有意义