从历史上看,我喜欢破坏表达式,以便在连续的行上显示“明显不完整”的偏见:
var something = foo + bar
+ baz(mumble);
这种态度源于使用需要分号终止表达式的语言进行工作。由于没有分号,第一行显然已经不完整,因此最好向读者说明第二行是不完整的。
替代方法是:
var something = foo + bar +
baz(mumble);
那对我不好。现在,要知道
baz(mumble);
不是独立的(不包括缩进),唯一的方法是将眼睛扫描到上一行的末尾。 *(大概很长,因为您需要首先将其断开。)*但是,在bizarro JavaScript领域中,我开始看到人们将代码从看起来像第一种形式的代码更改为第二种形式,并警告“自动分号插入”。它肯定会导致some surprising behaviors。当我在无限任务队列中输入“了解什么是自动分号以及是否也应该这样做”时,我并不是真的想深入研究这一切线。
当我研究它时,我发现自己是半确定的……但不确定……我的使用方式没有危险。看来问题出在我偶然放弃
+
并写成:var something = foo + bar
baz(mumble);
...然后JavaScript似乎为您在
foo + bar
之后插入了分号,这似乎是因为这两行都是完整的表达式。我推断出其他JavaScript程序员可能认为将“明显有意不完整”的部分偏向要继续的行的末尾会更好,因为它可以指出没有分号的位置。但是,如果我正确地陈述了前提,那么我将以一种“随后的线条明显不完整”的方式来设置虚线的样式。如果不是这种情况,那么我不会一开始就认为自己的优势。
我是否正确,我对自己描述的如何使用行连续的条件没有风险?是否存在实际上以令人惊讶的方式完成的“看起来不完整”的表达陷阱?
为了提供“以令人惊讶的方式完成”的示例,请考虑
+ 1;
是否可以单独解释为一行上的正数。似乎可以做到:但是JSFiddle为此返回了6:
var x = 3 + 2
+ 1;
alert(x)
也许这只是控制台中的一个怪癖,但它使我担心我的“只要第二行不完全代表完整的表达就可以了”的解释。
最佳答案
如果您采用某些句法有效的行并使用换行符对其进行标点,则自动分号将不适用(除非在return
,throw
和下面列出的其他语句很少的情况下)。仅当绝对没有其他方法可以解释代码时,才会发生ASI。当然,有一种方法可以将多行代码解释为单个语句,因为它可以作为一行有效。简而言之,ASI通常是解析器尝试理解程序的最后手段。
引用ES5,出现first case of ASI detailed in the spec ...
但是这种情况自然可以消除,因为在将换行符注入(inject)之前,在语法上是有效的行。因此,这种ASI情况不适用于您的情况,因为它取决于没有分号而在语法上无效的一段代码。你这里没有。
(其他两种情况也不适用;第二种情况适用于程序的末尾,第三种情况适用于continue
,break
,return
,throw
和后缀++
/--
运算符。)
人们对ASI的常见问题是,当作者有两条预期会分开站立的行时,但是当被理解为一条行时,这两行恰好不会引起语法问题。这种情况从两行开始,然后它们偶然地合而为一。你的情况是相反的:你以一行开始;它不会偶然变成两个。