10

我总是strict mode希望被屏蔽(或至少强制要求更改我的代码)免受 Javascript 语言问题的影响,例如使用过时的方法或错误解释的语法。

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

JS[H/L]int 碰巧无法识别 JS 解释器在哪里插入分号并标记它们以供我们缓解吗?


编辑

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

4

2 回答 2

1

关键字后面的表达式return必须始终与关键字在同一行开始,这与解释器无关,它是由 ECMAScript 标准定义的,它是语言的一个不好的部分,但如果你遵守 Douglas 描述的编写 JS 代码的规则Crockford 那么你就不会再遇到这种情况了。

来自 Douglas Crockford 的“JavaScript: The Good Parts”(附录 A.3 Awful Parts):

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

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

return
{
    status: true
};

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

return {
    status: true
};

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

于 2013-08-28T08:02:17.950 回答
1

只是想我会帮助遇到这个问题的任何人。
我已经开始使用 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)

有问题的代码块如下(注释描述了编译器提醒我的代码丢失了什么):

文件 1.js:150

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

文件 2.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关键字)。
希望它也能帮助你。

于 2015-04-07T04:28:15.863 回答