【发布时间】: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