从历史上看,我喜欢打破表达式,以便在续行上显示“它显然不完整”的偏见:
var something = foo + bar
+ baz(mumble);
这是一种来自于需要分号来终止表达式的语言的工作态度。由于没有分号,第一行已经显然不完整,因此最好让读者清楚第二行不完整。
替代方案是:
var something = foo + bar +
baz(mumble);
这对我来说不太好。现在,判断 baz(mumble);
不是独立的(除了缩进)的唯一方法是扫视你的眼睛到上一行的末尾。 *(这可能很长,因为您需要首先将其打破。)*
但是在奇怪的 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发生...
- When, as the program is parsed from left to right, a token (called the offending token) is encountered that is not allowed by any production of the grammar...
但是这种情况自然会被消除,因为在向其中注入(inject)换行符之前,您已经拥有了语法上有效的行。因此,这种 ASI 情况不能应用于您的情况,因为它依赖于没有分号的语法上无效的代码范围。你这里没有这个。
(另外两种情况也不适用;第二种情况适用于程序结束,第三种情况适用于 continue
、break
、return
、throw
和后缀 ++
/--
运算符。)
当作者有两行时,人们会遇到 ASI 的常见问题,他希望这两行能够分开,但是当将这两行理解为一行时,它们恰好不会引起语法问题。这个案例以两行开头,但意外地变成了一行。你的情况正好相反:你从一行开始;它不会意外地变成两个。
关于javascript - 下一行继续操作符是否存在分号插入危险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24858171/