JavaScript 编译错误

标签 javascript internet-explorer google-chrome safari compiler-errors

我在编写一些 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 : 
        };
    }

最佳答案

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

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

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

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

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

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

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

return {
    x: 0,
    y: 1
};

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

关于JavaScript 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18986144/

相关文章:

javascript - 为什么 document.documentElement.clientWidth 和 clientHeight 使我的 Canvas 为 300 像素 x 150 像素?

css - 相同的 CSS,不同的结果(Bootstrap4,仅限 Chrome)

javascript - 如何在 NodeJS 中创建带有路径的文件对象?

javascript - 重定向不受支持的浏览器的最简单方法是什么?

javascript - npm 包上的 "at"(@) 前缀是什么意思?

javascript - Internet Explorer 不会显示带有嵌入式 jquery 的呈现的 gsp

css - 防止 IE 中止具有错误 MIME 类型的图像

css - IE 6,7,8,9 CSS 兼容性样式表

javascript - 忽略 Chrome 应用程序/扩展中的 HSTS

javascript - jQuery 在 Chrome 18 中不起作用