进行一些JavaScript学习并使用语法。在JavaScript中,分号是可选的。建议使用它们,但在某些情况下,规范似乎并未强加它们。 特别是据说当没有歧义时,无论你是否使用它们都没有区别。
我找到了这个例子(我用谷歌搜索的一个练习),但没有解释。我认为分号在这里不应该有所作为,但确实如此。我不会在这里看到歧义,为什么它应该是不同的。我试着玩一些例子,它看起来真的不一样。无法绕过那个: - (
var y = x + f
(a+b).toString()
和
var y = x + f;
(a+b).toString();
如果一些大师可以阐明这一点,那会很酷。
答案 0 :(得分:7)
f
后跟空格和(
可以解释为函数调用。放置分号可以防止这种情况发生。
答案 1 :(得分:7)
ECMAScript标准规范在section 11.9.1中提到了自动分号插入的规则,我们需要阅读的第二条规则是:
当从左到右解析脚本或模块时,会遇到令牌输入流的末尾,解析器无法将输入令牌流解析为单个完整的ECMAScript脚本或Module,然后在输入流的末尾自动插入分号。 强调我的
所以我们走了。在过度简化的外行语言中,如果解析的继续没有给我们有效的代码,则插入分号。
在您的情况下,如果我们继续解析代码,我们会获得如下有效的ECMAScript代码:(因为JavaScript不是对空白区域敏感的)
var y = x + f(a+b)...
因此,不会插入分号。
第三条规则(如return
和yield
关键字用法)中描述了此例外情况,但它们不适用于您的代码。
答案 2 :(得分:3)
JavaScript中的空格(包括换行符)不是语法上的。因此,在上面,稍微重新排列,差异应该变得清晰。
这是:
var y = x + f(a+b).toString()
与此相同:
var y = x + f;
(a+b).toString();
不。在第一个例子中,f被调用,好像它是一个函数,变量a+b
被作为该函数的参数传递。
注意强> 有一个案例,我知道上述情况并不完全正确;退货声明。
换行符确实以返回语句的语法方式起作用,因此:
return {
tomatoes: 'are yummy'
}
会返回一个属性为tomatoes
的对象,而这个:
return
{
tomatoes: 'are yummy'
}
会返回undefined