JavaScript空白语法错误

gru*_*ner 8 javascript syntax formatting jquery whitespace

为什么这会导致return语句出现语法错误:

var FOO = (function($)
{
    return
    {      
        init: function()
        {

        }
    }
})(jQuery);
Run Code Online (Sandbox Code Playgroud)

然而,这不是:

var FOO = (function($)
{
    return {      
        init: function()
        {

        }
    }
})(jQuery);
Run Code Online (Sandbox Code Playgroud)

为什么会有区别?

Sol*_*ogi 21

这不是关于空白,而是关于JavaScript的自动分号插入.

ECMAScript规范说

某些ECMAScript语句(空语句,变量语句,表达式语句,do-while语句,continue语句,break语句,return语句和throw语句)必须以分号结束.此类分号可能始终显式出现在源文本中.然而,为方便起见,在某些情况下可以从源文本中省略这样的分号.这些情况通过说在这些情况下分号自动插入源代码令牌流来描述.

这意味着你的代码

var FOO = (function($)
{
    return
    {      
        init: function()
        {

        }
    }
})(jQuery);
Run Code Online (Sandbox Code Playgroud)

被翻译为

var FOO = (function($)
{
    return; // <- JavaScript will insert a semicolon here.

    {      
        init: function()
        {

        }
    }
})(jQuery);
Run Code Online (Sandbox Code Playgroud)

因此在执行函数后将不确定FOO.

对于你的其他代码,JS不会插入任何分号,它将正常工作 JS将在你的文字对象后插入分号,它应该工作正常.[编辑:kagnax指出的更正]

这意味着您应该始终以分号终止您的语句.让JS引擎插入分号会引入非常微妙的错误,这需要花费数小时来调试.您可以使用像JSLint这样的工具来警告您缺少分号.

  • 实际上,对于他的"其他代码",JS**将**插入分号,但仅在对象字面之后 - 如您引用的规范部分所述 - *ReturnStatement*s是ASI的候选者:) (3认同)