为什么这些明确的表达式在JavaScript中有所不同?

Ely*_*Ely 4 javascript

做一些JavaScript学习和玩弄语法.在JavaScript中,分号是可选的.建议使用它们,但在某些情况下,规范似乎并未强加它们.特别是据说当没有歧义时,无论你是否使用它们都没有区别.

我找到了这个例子(我用谷歌搜索的一个练习),但没有解释.我认为分号在这里不应该有所作为,但确实如此.我不认为这里有歧义,为什么它应该是不同的.我试着玩一些例子,它看起来真的不一样.不能包围我的头:-(

var y = x + f
(a+b).toString()
Run Code Online (Sandbox Code Playgroud)

var y = x + f;
(a+b).toString();
Run Code Online (Sandbox Code Playgroud)

如果一些古茹能够阐明这一点,那将会很酷.

Exe*_*ian 7

f随后的空白和一个(可以解释为一个函数调用.放置分号可以防止这种情况发生.


use*_*110 7

ECMAScript标准规范在11.9.1节中提到了自动分号插入的规则,而我们需要阅读的第二条规则是:

当从左到右解析脚本或模块时,会遇到令牌输入流的末尾,并且解析器无法将输入令牌流解析为单个完整的ECMAScript脚本或模块,然后会自动插入分号在输入流的末尾.强调我的

我们去了.在过度简化的外行语言中,如果解析的延续不能给我们有效的代码,则插入分号.

在您的情况下,如果我们继续解析代码,我们会得到有效的ECMAScript代码,如下所示:(因为JavaScript不是对空白区域敏感的)

var y = x + f(a+b)...
Run Code Online (Sandbox Code Playgroud)

因此,不会插入分号.

第三条规则(如returnyield关键字用法)中描述了对此的例外情况,但它们不适用于您的代码.