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

时间:2015-05-08 11:21:48

标签: javascript

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

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

var y = x + f
(a+b).toString()

var y = x + f;
(a+b).toString();
如果一些大师可以阐明这一点,那会很酷。

3 个答案:

答案 0 :(得分:7)

f后跟空格和(可以解释为函数调用。放置分号可以防止这种情况发生。

答案 1 :(得分:7)

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

  

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

所以我们走了。在过度简化的外行语言中,如果解析的继续没有给我们有效的代码,则插入分号。

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

var y = x + f(a+b)...

因此,不会插入分号。

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

答案 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