Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么JavaScript设计为在返回后自动插入分号,然后再插入新行?_Javascript_Syntax - Fatal编程技术网

为什么JavaScript设计为在返回后自动插入分号,然后再插入新行?

为什么JavaScript设计为在返回后自动插入分号,然后再插入新行?,javascript,syntax,Javascript,Syntax,我只是遇到了一个问题,我做到了: return isSomething() && isSomethingElse(); 这不起作用,因为JavaScript在返回后插入分号,使上述内容等效于: return; isSomething() && isSomethingElse(); 我完全搞不懂它为什么这样做。 我发现了一些关于该主题的堆栈溢出问题(例如,和),但它们只是解释了它何时执行此操作,并参考了 我甚至无法想象我想要返回的情形语句,后跟一

我只是遇到了一个问题,我做到了:

return
    isSomething() &&
    isSomethingElse();
这不起作用,因为JavaScript在返回后插入分号,使上述内容等效于:

return;
isSomething() && isSomethingElse();
我完全搞不懂它为什么这样做。 我发现了一些关于该主题的堆栈溢出问题(例如,和),但它们只是解释了它何时执行此操作,并参考了

我甚至无法想象我想要
返回的情形语句,后跟一些其他有效的JavaScript语句(除非您使用或可能使用一些我从未听说过的其他模糊JavaScript)。在我看来,这只会造成问题

我想知道的是为什么会这样为什么这是规范的一部分?

关于结束的,重复的。我想我清楚地表明,我阅读了其他问题和答案,说明这是JavaScript规范的一部分,甚至将我的问题与其他问题的区别放在了粗体中。“密切原因”中链接的问题不包含此问题的答案,与我链接的其他三个问题的形式完全相同。

这是一个“功能”,而不是错误

Javascript中的分号。

Javascript有一个“聪明”的特性,这使得分号在代码中通常是可选的。如果将分号保留在行尾,则会将其添加到行尾。根据:

分号仅在同一行上有两个或多个语句时才是必需的:
var i=0;我++/确切的原因可能在时间的迷雾中消失了。我敢打赌,事情是这样发生的:

  • 在某种程度上,有人认为在语句末尾使用分号是个好主意
  • 后来,有人注意到语法中的一个歧义,即当按照您描述的方式与
    return
    语句一起使用时,分号被省略
  • 正式语言规范随后被修改为关于返回语句中省略分号的令人困惑的新规则,以编纂当前的实践,而不是改变规则以使其有意义

有人可能会问,为什么一开始就要这样写代码。“我甚至无法想象有一种情况,我希望返回;语句后跟一些其他有效的javascript语句”——在这种情况下,您的
返回取决于
if
,也许你也可以省去那些圆括号……但是“这只会导致问题”:-@Kai说我还有很多子句要用一个缩进对齐。因为这就是需要发生的事情。因为有时候。。。事实还不够好。有时候人们不应该得到更多。有时候人们不应该得到他们信仰的回报。因为这是Javascript Gotham应得的,但不是它现在所需要的。“那么三个子句已经可以让您想要缩进”–好吧,然后使用
return([其他表达式之间需要多少换行符]),这个问题得到了解决:-)是的,但是按照这个逻辑,你可能会认为
var-val=5[line break]+4
可能会导致变量在之后的值为5,但事实并非如此。(是的,一个“独立的”
+4
本身就是一个有效的表达式。)我要说的是,尽管
+4
是一个有效的表达式,Javascript足够聪明,可以推断出没有人会将
+4
用作独立的表达式。我不知道为什么,但这篇链接文章很好地解释了它的工作原理。“只有在同一行上有两个或多个语句时,分号才是必需的”–使用
return[line break]val
您不需要,它仍然会产生
undefined
,即使
val
是一个带有值的已定义变量。抱歉,但是再多这样的论据也不能让我相信这种行为不仅仅是武断的,而且是“因为我们这么说了,这就是为什么”的变化:-)我不明白你怎么会认为第二个例子是不一致的-因为分号在那种情况下不是必须的,它假设在行的末尾应该有一个,并终止返回。我同意
var val=5[line break]+4示例没有意义,但使用
返回[line break]val,它在做它所说的——假设你遗漏了一个非强制性分号。“因为分号在这种情况下不是强制性的,所以它假设在这行的末尾应该有一个”—这就是不一致性,不是吗<代码>返回[换行]值-谁说应该有一个,而在
var val=5[line break]+4“他们”不这么说吗?(好吧,“谁”很清楚,是谁写的规范——但他们的原因是有问题的,超出了任何一致的逻辑。)对于实际发生的事情,似乎和任何猜测一样好,除非布伦丹·艾奇想过来告诉我们真正发生了什么。从“某个时刻”到“以后”之间的时间可能比你想象的要短得多(也许几分钟)。我认为正式语言规范的出现要晚得多,因为自动分号插入是其中的一部分(1997年6月,在1995年9月LiveScript首次在浏览器中发布将近2年之后)。OP的问题是,这是一个导致意外问题的功能。那么,他们为什么要加入一个如此容易混淆的特性呢。
The semicolon is only obligatory when you have two or more statements on the same line:

var i = 0; i++        // <-- semicolon obligatory
                      //     (but optional before newline)
var i = 0             // <-- semicolon optional
    i++               // <-- semicolon optional