【问题标题】:JSHint expected an assignment or function call for multiple assignmentJSHint 期望多次赋值的赋值或函数调用
【发布时间】:2014-12-26 19:37:36
【问题描述】:

我正在检查一些现有的 JavaScript,并收到错误消息 Expected an assignment or function call and instead saw an expression. 用于以下内容。

var k, i;
k = 0, i = -1;

分配似乎正确发生,那么导致 lint 警告的原因是什么?


为了更大的图景;如果有帮助的话,这就是函数开头的样子。

var subgroups = {},
    groupSums = [],
    groupIndex = d3.range(n),
    subgroupIndex = [],
    k,
    x,
    x0,
    i,
    j;

chords = [];
groups = [];

// Compute the sum.
k = 0, i = -1; while (++i < n) {
  x = 0, j = -1; while (++j < n) {
    x += matrix[i][j];
  }
  groupSums.push(x);
  subgroupIndex.push(d3.range(n));
  k += x;
}

【问题讨论】:

  • 你能把剩下的代码也贴出来吗?
  • 我在上面添加了额外的代码。这是函数的开始;变量是提前定义的,应该适当地提升到我的函数范围。
  • 请澄清 jshint 与 jslint,我猜是前者?

标签: javascript jslint jshint


【解决方案1】:

逗号运算符创建一个表达式。它是一个运算符,它计算左右两件事,然后将右边的作为其值。即使用逗号分隔的东西是赋值,JS 仍然将逗号操作符视为创建表达式。

JSLint 和 JSHint 不喜欢只是坐在那里不做任何事情的表达式,例如

0 !== 1;

致短绒,

k = 0, i = 1;

是一种孤独的表情,什么都不做。

在您的特定情况下,这样做可能更容易

for (k = 0, i = -1; ++i < n; ) {

就这样吧,虽然我个人会写

for (k = 0, i = 0; i < n; i++) {

您可能已经知道,您可以将其关闭(JSHint 的示例):

/*jshint -W030*/
/*jshint expr:true*/

【讨论】:

  • 明白了;这就是我要找的。试图了解 JavaScript 是如何处理这个问题的,并理解它是错误形式的根本原因。谢谢。这是我刚刚开始研究的现有代码库,因此我不想在 linter 中禁用它们;只是想在遇到我不认识的事情时了解事情的“原因”。
【解决方案2】:

使用var 关键字,错误就会消失。(原来OP 确实使用了var 关键字。)

使用逗号运算符将两个单独的赋值合并到一个表达式中,如下所示:

k = 0, i = -1;

在 JavaScript 中是合法的。不过,这不被认为是好的风格。只需使用分号作为语句分隔符:

k = 0; i = -1;

逗号运算符,根据 MDN:

当您想在需要单个表达式的位置包含多个表达式时,可以使用逗号运算符。

您的情况不符合要求。巧妙地使用语言特征被认为是有害的。尽量不要在代码高尔夫比赛之外做聪明的事情。

【讨论】:

  • 我稍微修改了上面的代码 sn-p 以显示变量是提前声明的。
  • 如果你想抑制警告,请在你的 .jshintrc 文件中使用"expr": true,
  • Torazaburo 很好地解释了为什么这种方法有效且风格不好,这正是我在这里试图理解的,但这也很有帮助,所以也投了赞成票。谢谢。
  • jshint 不喜欢其他语法上有效的 JS sn-ps:试试while (var i = fooFunc(arg)) { /* ... */ }。这是合法的 JS,包含在规范和所有内容中,但由于其糟糕的风格会引发一系列错误。
【解决方案3】:

你应该这样做:

k = 0;
i = -1;

【讨论】:

  • 我明白这样会去掉消息;我试图理解为什么这被认为是一种不好的做法,或者为什么它在第一种情况下被标记。
猜你喜欢
  • 2018-10-21
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
  • 2017-09-09
相关资源
最近更新 更多