【问题标题】:Is it necessary to (re?) use "var" here?是否有必要(重新?)在这里使用“var”?
【发布时间】:2019-05-12 23:13:09
【问题描述】:

我正在针对旧应用程序运行 SonarQube。它在 JavaScript 中标记了一些东西(不是 TypeScript 或任何花哨的现代东西,只是普通的旧 JavaScript),我认为这是一个误报,但我不是百分百确定。它看起来像这个最小的例子:

var foo=null;
var bar=["a","b","c","foobar"]
for(var i=0; i<bar.length; i++) {
    if(bar[i] == "foobar") {
        foo = i;
    }
}

它在 foo = i; 行上标记。说我们应该使用“var”来声明 foo,但是你可以看到 foo 是之前声明的。这是一些奇怪的 JavaScript 范围的事情,我需要再次使用 var 吗?或者我可以将其标记为误报并继续吗?

(实际应用程序按预期工作,但我们被要求阅读并[以某种方式]解决任何 SonarQube 调查结果。)

这是另一个您可能会发现更合理的最小示例...它在许多类似示例中都有标记(记住这个应用程序很旧,我们并没有真正美化它,实际上是前端至少 即将在不久的将来完全重写),其中许多真的很简单:

var isFoobar=false;
var bar=["foo","foobar"];
for(var i=0; i<bar.length; i++) {
    if(bar[i] == "foobar") {
        isFoobar = true;
    }
    // if baz, set isBaz variable
    // if buzz, set isBuzz variable
    // etc. etc. for many more
}
// do something with isFoobar, isBaz, isBuzz, etc., down here

尽管看起来很疯狂,但在编写本文时,诸如“indexOf”之类的东西并不存在(最初支持 IE 8 或更早版本,此后从未升级,只是继续在 IE 中以“旧模式”运行)。

【问题讨论】:

  • 将var 添加到foo 的分配是没有意义的。如果这真的是代码的样子,那么该工具是错误的。
  • 恕我直言,var foo = -1; 比 var foo = null; 更一致。也许该工具建议重新声明变量,因为数据类型发生了变化。
  • 事实上,如果您在此处添加var,其他工具(如eslint)会警告您正在重新声明变量。
  • 有些东西应该警告你整个代码可以被foo = bar.lastIndexOf("foobar");替换
  • 所有这一切都说,我的钱将花在这个玩具示例上,不能正确反映实际代码。我怀疑这是否真的是误报,这似乎太疯狂了。

标签: javascript sonarqube


【解决方案1】:

这是一个误报 - 您可以使用以下方法清理内容:

var foo = ["a","b","c","foobar"].lastIndexOf("foobar");
foo = foo < 0 ? null : foo;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 2021-08-02
    • 2016-02-06
    • 1970-01-01
    相关资源
    最近更新 更多