为什么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提到了“隐式分号插入”,但是在打开{
的情况下,不是关闭一个。
即使下一个令牌是}
指令,Javascript也可以在关闭if
else
块之后插入分号吗?
很抱歉我的问题有点混乱 - 我试图大声思考。
答案 0 :(得分:10)
JSLint基于Crockford的偏好(我在这种情况下分享)。
这是一个“更好”的意见问题。
(虽然显然他的观点是对的;)
答案 1 :(得分:5)
这不是风格问题。这就是ECMAScript的工作原理。
无论好坏,它会在声明必要时自动插入分号。
JavaScript会解释这个:
function someFunc {
return
{
something: 'My Value'
};
}
这样:
function someFunc {
return;
{
something: 'My Value'
};
}
这肯定是不想要的。
如果您始终将括号放在与if
和if 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{
不是最流行的方法。有趣的是如何开放括号 {(空间与否)显然都受到了影响