繁体   English   中英

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

[英]Disable, or at least detect, automatic semicolon insertion

我总是以strict mode编写代码,希望屏蔽(或者至少强行告诉他更改我的代码)来解决Javascript语言的问题,例如使用弃用的方法或错误解释的语法。

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

JS [H / L] int似乎没有能够接受JS解释器插入分号并标记它们以便我们减轻它的位置吗?


编辑

如果在return关键字后面找到分号之前存在新行,则JShintJSLint都会出错。 但是,我不知道有关自动插入的其他警告以及它们是否也被检测到。
无论如何,如果答案实际上解决了“禁用”部分,那将更具相关性。

return关键字之后的表达式必须始终与关键字在同一行上开始,这与解释器无关,它是由ECMAScript标准定义的,它是语言的一个不好的部分但是如果你尊重编写JS代码所描述的规则Douglas Crockford然后你再也不会遇到这个了。

来自Douglas Crockford的“JavaScript:The Good Parts”(附录A.3可怕的部分):

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

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

return
{
    status: true
};

这似乎返回包含状态成员的对象。 不幸的是,分号插入将其转换为返回undefined的语句。 没有任何警告说分号插入导致了对程序的误解。 如果{放在上一行的末尾而不是下一行的开头,则可以避免此问题:

return {
    status: true
};

另请参阅Douglas Crockford的JavaScript代码约定: http//javascript.crockford.com/code.html

我以为我会帮助遇到这个问题的人。
我已经开始使用Google的Closure Comiler来缩小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的缩小器为我做的更多(这忽略了所有这些例)。
此外,与YUI相比,编译器能够接收多个文件输入,因此可以为每个文件提供错误的行号,并且不会出错/重新生成debugger关键字)。
希望它也会对你有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM