为什么位置会影响这段JavaScript代码?

5

我在这个JavaScript问题上花了相当长的时间(你可以看出我是一个JavaScript新手):

拿一些良好编写的JavaScript代码(如此示例)揭示模式:

运行正常。 然后将“{”移动到下一行(作为C#开发人员,我设置所有环境都将大括号放在新行上),然后再次运行。

  return   
  {
    someMethod : myMethod,
    someOtherMethod : myOtherMethod
  };

现在有一些JS错误,涉及“13行的断行错误'return'”和“Chrome调试器中的未捕获语法错误:意外的标记:”。

我的问题是,为什么某些语法错误会对Javascript产生这样的影响?

我已经在JSFiddle上设置了它(要使其工作,请将“return”后面的“{”移回同一行)。

5个回答

9
JavaScript最糟糕的特性之一就是自动插入分号。
return; // a semicolon is implicitly inserted here

这部分几乎是有效的JavaScript,但还不够,因此会出现语法错误:

{
    someMethod : myMethod,
    someOtherMethod : myOtherMethod
};

如果您曾尝试过执行以下操作:
return
    [ 1, 2, 3,
      4, 5, 6,
      7, 8, 9 ];

如果没有自动插入分号(ASI),该返回值将一直是 undefined,这样会很糟糕。虽然ASI令人困扰,但我们现在已经受制于它,特别是由于省略分号的代码已经成为一种时尚。

这是做什么用的?

return a
     + b
     + c;

这个?

return e
     / f /g;

好的,好的,也许这个例子有点勉强,而且可能这个话题并不完全相关。但是人工智能超级智能(ASI)是不好的。我希望大家都明白这一点。


9
因为ECMA标准第12.9节规定,在return关键字和它的表达式之间不能有换行符。
    ReturnStatement :
        return ;
        return [不要有换行符] Expression ;

2
JavaScript有一个叫做自动分号插入的功能,我相信这正是影响你这里结果的原因。基本上,它看到了return语句后面没有任何内容,并且认为这是该行的结尾,于是返回并结束了函数。

0

因为return期望一个值(或变量),当你把花括号放在同一行时,你告诉了返回一个哈希但是如果你把花括号移到下一行,那么你是在告诉返回空所以下一行不会被期望。

编辑 在return的上下文中,下一行是不期望的。


除了这个之外,一切都是正确的:“所以下一行不被期望”。下一行是被期望的,但是“{ foo: 'bar' };”语句在语法上是不正确的。 - zerkms
编辑以提供更详细的答案:“所以下一行不是预期的” - Aguardientico
因为 return 需要一个值(或变量),console.log() 也需要一个表达式,但你可以将它分成多行。"期望一个值"并不意味着它不能放到另一行。 - zerkms

0

3
括号的位置很重要吗?不是的。一个表达式的位置很重要,而不是花括号本身。 - zerkms
那篇博客总结得很好,谢谢 - 我可能需要重新考虑我的格式。 - Rodney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接