为什么新的JSLint错误“使用空格,而不是制表符”和“不安全的字符”被引入?

时间:2012-12-17 11:23:59

标签: javascript jslint

我已经使用JSLint验证了我的JavaScript大约2年了,偶尔会有一些规则发生变化。通常,当JSLint引入新规则时,有一个复选框可以在解析时忽略此规则,或者如果您选择不忽略它,那么使您的代码符合它。

然而,当我今天运行JSLint验证时,我遇到了这两个新错误:

  

使用空格,而不是标签。

这不是“混合标签和空格”错误。我只使用标签。这是最近修改的“标签和空格混合”版本,现在通常不允许使用标签。

  

不安全的角色。

     

* /

     

不安全的角色。

     

_const:{

没有新的选项可以忽略。我无法理解关闭块注释的不安全性,为什么它认为_const:{当我有nomen: true时不安全,(在标识符中悬空_)或为什么我突然从空格切换到标签,当我仍然有关4个空格缩进的配置是一个标签。

有没有人知道为什么这些被引入至少如何让JSLint忽略这些新规则?

更新 Messy White Space 选项适用于该问题但会导致其他意外行为:

if (condition) { 
  //            ^-- there is a space but it won't indicate an error

4 个答案:

答案 0 :(得分:72)

看起来道格拉斯·克罗克福德只是让更多的人转向JSHint。看看this commit

已删除“混合空格和制表符”错误,并在其位置添加了新的“使用空格,而非制表符”错误。除此之外,差异中的一个微小变化显示了原因。以下行(添加评论):

at = source_row.search(/ \t/);
//                      ^ Space

已被替换为:

at = source_row.search(/\t/);
//                      ^ No space!

在搜索之后有一个if语句。如果条件评估为true,则会发出“使用空格,而不是制表符”警告。这是声明:

if (at >= 0) {
    warn_at('use_spaces', line, at + 1);
}

希望这只是Crockford的一点疏忽。如您所见,如果您在任何地方使用选项卡,JSLint现在将引发此警告。不幸的是,他的提交信息完全没用,而且文档似乎没有更新,所以除了推测这个改变背后的原因之外我什么也做不了。

我建议您放弃JSLint并立即切换到JSHint

答案 1 :(得分:12)

您可以点击“凌乱的空格”选项来抑制错误。

答案 2 :(得分:7)

要回答为什么 JSLint现在提供有关标签的错误,http://www.jslint.com/help.html给出了这样的理由:

  

标签和空格不应混合使用。我们应该只选择一个   避免两者兼而有之的问题。个人喜好   是一个非常不可靠的标准。两者都没有强大的功能   优势超过另一个。五十年前,tab具有优势   消耗更少的记忆,但摩尔定律已经消除了这一优势。   与tab相比,Space有一个明显的优势:没有可靠的标准   一个标签代表多少空格,但它被普遍接受   一个空间占据一个空间。所以使用空格。您可以使用标签进行编辑   如果必须,但在提交之前确保它是空格。也许   有一天,我们终于会获得制表符的通用标准,但直到   那一天到来,更好的选择是空间。

基本上,他希望每个人就是否使用制表符或空格来防止它们混合达成共识。他决定空间宽度的一致性使其成为最佳选择,因此我们都应该使用它。很明显,有些人会不同意这种思路(包括我自己),但这就是JSLint抛出错误的原因。

答案 3 :(得分:6)

根据您的编辑器/ IDE,您可以调整TAB的工作方式。

例如,我使用Sublime Text。 在右下角附近有一个标签大小:4。

我点击它并将其设置为'缩进使用空格'。

这更新了我的所有选项卡以使用空格和JSLint错误消失。我尝试使用尽可能少的JSLint选项,因为我希望我的代码结构良好。

我也使用JSFormat,它将根据我的编辑器设置进行选项卡,所以每当我完成运行我的JSFormat,然后运行JSLint。没有错误=快乐的男孩!

希望它有所帮助。