JavaScript空白语法错误

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

var FOO = (function($) { return { init: function() { } } })(jQuery); 

而这不是:

 var FOO = (function($) { return { init: function() { } } })(jQuery); 

为什么会有区别?

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

ECMAScript规范说

某些ECMAScript语句(空语句,变量语句,表达式语句,do-while语句,continue语句,break语句,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这样的工具来警告您缺少分号。