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

时间:2013-08-28 07:50:03

标签: javascript syntax

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

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

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


修改

如果在return关键字后面找到分号之前存在新行,则

JShintJSLint都会出错。但是,我不知道有关自动插入的其他警告以及是否每个都被检测到 无论如何,如果答案实际上解决了“禁用”部分,那将更具相关性。

2 个答案:

答案 0 :(得分:3)

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

来自道格拉斯·克罗克福德的“JavaScript:好的部分”(附录A.3可怕的部分):

  

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

     

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

在同一行开始
return
{
    status: true
};
  

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

return {
    status: true
};

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

答案 1 :(得分:0)

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