4

在编写一些 JS 代码时,我注意到一件奇怪的事情。这个编译错误似乎发生在多个浏览器上(测试:Chrome、IE、Safari)。我不急于寻求解决方案,但我无法弄清楚为什么这段代码无法编译:

    function fooBar1()//Compiles
    {
        return {
            x: 0,
            y: 1
        };
    }
    function fooBar2()//Compiles
    {
        return {x: 0, y: 1};
    }
    function fooBar3()//Compiles
    {
        return
        {
            x: 0
        };
    }
    function fooBar4()//Does not compile
    {
        return
        {
            x: 0,
            y: 1//Uncaught SyntaxError: Unexpected token : 
        };
    }
4

2 回答 2

1

这是由于 Javascript 的自动分号插入“功能”。

我把“功能”这个词放在引号里,因为它真的不是——坦率地说,它有点像一场灾难;我所知道的语言中最糟糕的设计决策之一。

基本上,JS 语言被设计为所有语句都以分号结尾,但原始语言设计允许忘记它的编码人员,因此如果它看到没有分号的换行符,它会尝试猜测是否那里应该有一个。

不幸的是,在某些情况下,这会导致歧义和错误,而return陈述可能是最糟糕的。

在您的最后一个示例中,{要返回的对象的 位于return语句之后的行上。这是此类错误的经典案例。JS 会自动在 后面插入分号return,你要返回的对象被忽略。

简单的答案:不要这样做。始终将对象与return语句放在同一行。记住需要返回数据与语句本身return在同一行(或至少从同一行开始)的事实。return

第一个示例显示了您可以最接近损坏的示例并且仍然可以正常工作的方法。

return {
    x: 0,
    y: 1
};

作为最后的想法,您可能需要考虑通过jsLint 之类的工具运行 JS 代码,该工具会发现此类错误(以及其他潜在问题)。

于 2013-09-24T15:51:51.403 回答
0

像这样的虫子真的可以让人发疯,不是吗?

我的猜测是 javascript 解析器在 fooBar4 中返回后立即添加了一个分号。(它“认为”你想要它在那里)

至少当我通过在返回后添加分号来修改您的任何工作函数时,会出现相同的语法错误

于 2013-09-24T15:58:21.060 回答