为什么会导致return语句出现语法错误:
var FOO = (function($)
{
return
{
init: function()
{
}
}
})(jQuery);
然而这不是:
var FOO = (function($)
{
return {
init: function()
{
}
}
})(jQuery);
为什么会有区别?
答案 0 :(得分:21)
这不是关于空白,而是关于JavaScript自动分号插入。
ECMAScript规范说
某些ECMAScript语句(空 声明,变量声明, 表达式声明,do-while 声明,继续声明,休息 声明,return语句和throw 声明)必须以 分号。这样的分号可能总是如此 显式出现在源文本中。 然而,为方便起见,这样 分号可以省略 在某些情况下的源文本。 这些情况由描述 说分号是 自动插入源 这些情况下的代码令牌流。
这意味着你的代码
var FOO = (function($)
{
return
{
init: function()
{
}
}
})(jQuery);
被翻译为
var FOO = (function($)
{
return; // <- JavaScript will insert a semicolon here.
{
init: function()
{
}
}
})(jQuery);
执行该功能后,FOO将不确定。
对于你的其他代码, JS不会插入任何分号并且它将正常工作 JS将在你的文字对象之后插入分号,它应该可以正常工作。 [编辑:kagnax指出的更正]
这意味着您应该始终以分号结束语句。让JS引擎插入分号会引入非常微妙的错误,这需要花费数小时来调试。您可以使用JSLint之类的工具来警告您缺少分号。