Javascript 禁用或至少检测自动分号插入

Javascript 禁用或至少检测自动分号插入,javascript,syntax,Javascript,Syntax,我总是在严格模式下编码,希望避免Javascript语言出现问题,比如使用不推荐的方法或错误解释的语法 然而,我今天遇到了问题,我想知道是否有任何方法可以禁用浏览器中的分号插入,或者有类似于严格模式的“编译”时错误 JS[H/L]int恰好无法识别JS解释器插入分号的位置,并为我们标记分号,是吗 编辑 如果在return关键字后面找到分号之前出现新行,则这两个错误都会出现。但是,我不知道关于自动插入的其他注意事项以及它们是否也被检测到。 无论如何,如果一个答案实际上解决了“禁用”部分,那就更相

我总是在
严格模式下编码
,希望避免Javascript语言出现问题,比如使用不推荐的方法或错误解释的语法

然而,我今天遇到了问题,我想知道是否有任何方法可以禁用浏览器中的分号插入,或者有类似于严格模式的“编译”时错误

JS[H/L]int恰好无法识别JS解释器插入分号的位置,并为我们标记分号,是吗


编辑

如果在
return
关键字后面找到分号之前出现新行,则这两个错误都会出现。但是,我不知道关于自动插入的其他注意事项以及它们是否也被检测到。

无论如何,如果一个答案实际上解决了“禁用”部分,那就更相关了。

返回关键字后的表达式必须始终在关键字所在的同一行开始,这与解释器无关,由ECMAScript标准定义,这是语言中很糟糕的一部分,但是如果您遵守Douglas Crockford描述的编写JS代码的规则,那么您就不会再遇到这种情况

来自Douglas Crockford的“JavaScript:好的部分”(附录A.3糟糕的部分):

JavaScript有一种通过自动插入分号来纠正错误程序的机制。不要依赖这个。它可以掩盖更严重的错误

它有时会在不受欢迎的地方插入分号。考虑返回语句中分号插入的后果。如果return语句返回值,则该值表达式必须与return语句在同一行开始:

这似乎返回了一个包含状态成员的对象。不幸的是,分号插入将其转换为返回未定义的语句。没有关于分号插入导致程序错误解释的警告。如果{位于前一行的末尾而不是下一行的开头,则可以避免此问题:


另请参阅Douglas Crockford的JavaScript代码约定:

我想我会帮助任何遇到这个问题的人。
我已经开始使用谷歌的缩小JS的项目,它给了我一些方便的警告

   $> java -jar google_closure_compiler.jar  --language_in=ECMASCRIPT5_STRICT --js_output_file 'min.js' 'file1.js' 'file2.js'
   file1.js:152: WARNING - unreachable code
               getSomething(function() { return this.doThingo(''); });
               ^

   file2.js:203: WARNING - Suspicious code. The result of the 'add' operator is not being used.
               ' to ' + (typeof obj);
               ^

   0 error(s), 2 warning(s)
有问题的代码块如下所示(注释描述了编译器提醒我缺少的代码):

file1.js:150

    return generateSomeObject(bunch, of, arguments)
        //the period before the function call was missing
        getSomething(function() { return this.doThingo(''); });
}
file2.js:201

if (someCondition)
    //trailing plus was missing from this line
    throw 'Could not set ' + last + ' of ' + (typeof root)
        ' to ' + (typeof obj);
return old;
我不知道它是否会识别出浏览器整理的所有错误(因此我可能不会将此标记为答案),但它比YUI的minifier为我所做的要多得多(它忽略了所有这些情况)。
此外,与YUI相比,编译器能够接受多个文件输入,因此可以为每个文件提供错误行号,并且不会在
调试器上出错/重新激活
关键字)。

希望它也能对您有所帮助。

相关,可能重复:这并不限制对node的回答,并要求使用代码检查技术作为替代。虽然这是真的,但我不怀疑还有其他注意事项。不管怎样,至少看看JS解释器在我们的代码中插入内容的位置可能会很有趣(如果有一个自动化的解决方案,而不是学习具体的案例)@Hashbrown,请看我编辑过的答案,我不知道任何自动解决方案,但是如果你使用类似Java的代码样式,这个问题就解决了。我知道发生了什么,我想阻止它。我不是“依赖”插入,它阻碍了我。再说一次,问题的重点不是关于
返回
的问题,这就是问题所在如果我注意到了,它还将插入其他一些东西,我希望将其彻底根除。看起来禁用可能要求太多,但我很乐意检测插入,即从编译器那里得到一份报告,告诉我它做了什么。我太笨了,不会编写始终遵循ECMAScript标准或Crockf的代码ord-我甚至会犯拼写错误和语法错误,有时是在同一天。对于那种愚蠢的行为,我需要一个自动化的过程,而不是另一个人告诉我如何处理。这并不是问题的真正答案,只是一个“你做错了”的答案,没有任何帮助
    return generateSomeObject(bunch, of, arguments)
        //the period before the function call was missing
        getSomething(function() { return this.doThingo(''); });
}
if (someCondition)
    //trailing plus was missing from this line
    throw 'Could not set ' + last + ' of ' + (typeof root)
        ' to ' + (typeof obj);
return old;