JSLint,else和预期'}'和'else'错误之间只有一个空格

时间:2011-11-15 00:35:19

标签: javascript code-formatting jslint

为什么JSLint在代码中报告:

function cos(a) {
    var b = 0;
    if (a) {
        b = 1;
    }
    else {
        b = 2;
    }

    return b;
}

错误:

Problem at line 6 character 5: Expected exactly one space between '}' and 'else'.

可以通过禁用JSLint的 Tolerate messy white space 选项来关闭此错误。

或换句话说 - 为什么语法: } else {

更好
...
}
else {
...
带有} else {表单的

Google also uses语法。

但我不明白为什么。 Google提到了“隐式分号插入”,但是在打开{的情况下,不是关闭一个。

即使下一个令牌是}指令,Javascript也可以在关闭if else块之后插入分号吗?

很抱歉我的问题有点混乱 - 我试图大声思考

6 个答案:

答案 0 :(得分:10)

JSLint基于Crockford的偏好(我在这种情况下分享)。

这是一个“更好”的意见问题。

(虽然显然他的观点是对的;)

答案 1 :(得分:5)

这不是风格问题。这就是ECMAScript的工作原理。

无论好坏,它会在声明必要时自动插入分号。

JavaScript会解释这个:

function someFunc {
    return
    {
        something: 'My Value'
    };
}

这样:

function someFunc {
    return;
    {
        something: 'My Value'
    };
}

这肯定是想要的。

如果您始终将括号放在与ifif else语句相同的行上,则不会遇到这样的问题。

与任何编码语言一样,所选择的编码风格应该是最大限度地降低潜在风险的编码风格。

Mozilla开发者网络也推广相同的行包围:https://developer.mozilla.org/en-US/docs/User:GavinSharp_JS_Style_Guidelines#Brackets

答案 2 :(得分:3)

JSLint在这里很挑剔。写这篇文章的人也提出了许多风格建议,以保持自己的代码更加一致。

至于分号插入,你不必在此担心。在else子句之前插入分号会导致语法错误,并且自动分号插入仅在结果代码仍然在语法上有效的情况下发生。

如果您想了解有关分号插入的更多信息,建议您this nice reference

基本上,如果你在任何地方插入分号,你只需要小心将参数放在同一行的“return”或“throw”(或“break”和“continue”的标签)上。

当你不小心忘记分号时,唯一可能咬你的常见情况是,如果你用一个数组文字(它可能被解析为下标运算符)或一个括号表达式(它可能被解析)开始下一行作为函数调用)

  

结论

     

您是否应省略可选分号?答案是一个问题   个人偏好,但应在知情的基础上作出   选择而非模糊恐惧的未知句法陷阱或   不存在的浏览器错误。如果你还记得这里给出的规则,那么你   有能力做出自己的选择,并阅读任何JavaScript   容易。

     

如果您选择在可能的情况下省略分号,我的建议是   在开括号或正方形之前插入它们   括在任何以其中一个令牌或任何令牌开头的陈述中的括号   它以算术运算符标记“/”,“+”或其中一个开头   “ - ”如果你碰巧写下这样的陈述。

     

无论你是否省略分号,你都必须记住限制   产品(返回,中断,继续,抛出和后缀增量   并减少运营商),你应该随意使用linebreaks   在其他任何地方都可以提高代码的可读性。


顺便说一下,我个人认为} else {版本比较漂亮。停止坚持你的邪恶方式,并加入我们在力量的光明方面:P

答案 3 :(得分:3)

JSLint在这里非常挑剔,只是强制执行你可能不会分享的样式

请尝试JSHint

  

该项目最初的目的是为了制作一个更可配置的JSLint版本 - 一个不对其用户强制执行某种特定编码风格的版本[...]

答案 4 :(得分:0)

我刚读完一本名为Mastering JavaScript High Performance的书。我在这里纠正,但从我可以收集到的是“白色空间”确实很重要。

它与解释器获取下一个函数的方式有关。通过在代码准备好部署时使用minifier将空白区域保持在最小(即),实际上可以加快进程。

如果解释器必须搜索空格以查找下一个语句,则需要时间。也许你想用一段代码运行一个循环,用 10,000次带空格然后相同的代码缩小来测试它。

在循环开始之前放置的语句将是console.timeEnd,最后是循环结束时的public static int numberOfPairs(Integer[] array, int sum) { Set<Integer> set = new HashSet<>(Arrays.asList(array)); // this set will keep track of the unique pairs. Set<String> uniquePairs = new HashSet<String>(); for (int i : array) { int x = sum - i; if (set.contains(x)) { int[] y = new int[] { x, i }; Arrays.sort(y); uniquePairs.add(Arrays.toString(y)); } } //System.out.println(uniquePairs.size()); return uniquePairs.size(); } 。然后,这将告诉您循环计算多少毫秒。

答案 5 :(得分:0)

JSLint错误/警告建议将代码更改为

// naming convention winner? it's subjective
} else if{
    b = 2;
}

从:

}
else if{
 b = 2;
}

它阻止了insert semicolons;更多标准&amp;常规。 大多数人可以同意之间的标签 }tabelse if{

不是最流行的方法。有趣的是如何开放括号 {(空间与否)显然都受到了影响