为什么这个声明需要分号?

时间:2016-12-22 09:36:34

标签: javascript

以下代码返回错误消息 " console.log(...)不是函数"

if (4<5) console.log('hi') 
(4<5) ? console.log('hi') : console.log('bye')

以下代码不会返回任何错误

if (4<5) console.log('hi')
if (4<5) console.log('hi')

为什么会这样?

1 个答案:

答案 0 :(得分:5)

在第一行末尾没有分号,代码尝试使用第一个console.log的返回值作为函数,并使用参数4<5调用它;如果删除换行符,则更清楚:

if (4<5) console.log('hi')(4<5) ? console.log('hi') : console.log('bye')
//       ^^^^^^^^^^^^^^^^^^^^^^---- looks like calling `console.log` and then
//                                  using the result as a function

任何时候你结合使用分号(这意味着你依赖于纠错机制 1 )的可能性用表达式语句。由于表达式语句本质上是表达式,如果解析器可以在前面的表达式或语句中使用它们,它将会。

FWIW,astexplorer.net是我最近发现的一个很酷的工具(感谢Babel项目)。它是一个交互式语法树资源管理器,它可以使用多个解析器中的任何一个来解析您的代码,并告诉您完全如何解析它。从github帐户开始,它由我们自己的Felix Kling启动。

1 Quoting Brendan Eich

  

ASI(正式来说)是一种语法错误纠正程序。如果您开始编码就好像它是一个普遍的重要换行规则,那么您将遇到麻烦。