缺少预期的分号,反而看到了逗号 - JSLint 多变量设置

12
截至2016年1月14日左右,JSLint开始抱怨每个声明中有多个变量的varlet声明,并创建了一个新指令multivar来忽略这个新的“问题”。
这是一个相当重要的变化,因为早期版本会抱怨在同一代码块中有两个var
也就是说,截至今天(2016年1月18日),此代码现在在JSLint中无法运行。
/*jslint white:true, browser:true, devel:true */
function a(b) {
    "use strict";
    var c, d; // <<< Now bad!!
    d = "test";
    c = d + b;
    console.log(c);
}

报告的错误是,期望';'而看到了','。,出现在var c,d;这一行。
“正确”的修复方法似乎是这样的:
/*jslint white:true, browser:true, devel:true */
function a(b) {
    "use strict";
    var c;
    var d;  // <<< this *used* to be forbidden.
    d = "test";
    c = d + b;
    console.log(c);
}

请注意,这段新的正确代码在早期版本的JSLint中会产生错误Error: combine_var

我能找到的Crockford关于这个变化的唯一描述似乎是在Google Plus上的这篇文章中:

JSLint现在有一个multivar选项,它允许在单个varletconst语句中声明多个名称。

... 还有网站说明上的快速提及...

容忍每个语句中多个变量声明
multivar
如果一个varletconst语句可以在一个语句中声明两个或更多个变量,则为true

multivar在JSLint.com上的更改似乎还没有出现在GitHub仓库中。请参见两个提交(12),标题为“var”的14日。这两个提交使得JSLint中的代码遵循了新的要求,但是(据我所知)并没有添加描述和在JSLint.com上使用的multivar指令。

除了通常的“您应该忽略JSLint”答案之外,有人能告诉我为什么现在鼓励/要求多个var行吗?也就是说,为什么以前需要单个var(我猜是为了鼓励hoisting的理解),而这个原因突然变得无关紧要了呢?


如果你要投反对票和/或关闭投票,一条评论会非常有帮助。谢谢! - ruffin
1
不确定为什么会被踩,但这是一个非常激进的改变,我绝对没有预料到(特别是它默认是禁用的)。 - Josh Crozier
3
嘿@JoshCrozier!没错,这也让我感到惊讶。这不仅是一个变化,就像JSLint最近建议我们停止使用for循环一样,它是与以前所需完全相反的改变。 - ruffin
1
看起来Crockford先生也重写了他的代码规范页面。 - Teemu
1
@Teemu 很好的发现。他确实在那里说,“最好每个变量声明语句都在自己的一行上,并包括注释”。不幸的是,即使在整个页面中也没有遵循这个新规则...参见函数声明--没有"use strict"',有一个var array, ncn = node.className;!当我对它进行lint时,我得到了一个Expected ';' and instead saw ','.。至少这表明这是相当新的,我想。 - ruffin
1个回答

3
来自AirBNB样式指南。
这种方式更容易添加新的变量声明,您永远不必担心将;替换为,或引入仅包含标点符号的差异。 您还可以使用调试器逐个声明地跟踪,而不是立即跳转到所有声明。
有关详细信息,请参见:https://github.com/airbnb/javascript#variables

3
当然,我明白这有道理,但我不确定那就是原因。也就是说,这就是为什么我在写SQL时会使用WHERE 1=1和每个AND子句单独一行的原因,但在这种情况下奇怪的是,JSLint不仅鼓励而且要求做了一个完全180度的转变。一个完整的答案将解释为什么约定完全改变了(我猜是为了鼓励了解提升),以及为什么这个理由突然变得无关紧要?所以加一分,但我现在还不能接受答案。 - ruffin
1
看起来我们不会很快得到更好的答案。我暂时接受这个,但如果我以后得到更好的答案,你要小心了。 :^P - ruffin
1
经过进一步思考,我的猜测是这是一种确保所有变量都在函数顶部的简单方法。现在我们有了“const”和“let”,这种做法已经不太合理了。 - David Bradshaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接