为什么这里的变量声明据说是多余的

Why is variable declaration supposedly redundant here

我有这个方法:

  getRandomKey(){
    const r = Math.floor(Math.random()*this.lookup.size);
    let i = 0, k = null;
    for(k of this.lookup.keys()){
      if(i === r) {
        break;
      }
      i++;
    }

    return k;
  }

我的 IDE (Webstorm) 是这样说的:

我以前见过这样的事情,我很确定你需要声明变量 k 否则它将是全局的,我在这里错过了什么?

是因为你把k设置成null是多余的,用k;替换了k = null;,之所以多余是因为你没有对k做任何事情在将值更改为其他值之前。这意味着您可以将 k 设置为任何值,只要您在实际使用它之前(无条件地)更改它,您就会看到此调试消息。

即在 WebStorm 中:

let i = 0, k = null;
for(k of this.lookup.keys()){
      if(i === r) {
        break;
      }
      i++;
    }

给出:

Variable initializer is redundant

然而,

let i = 0, k;
for(k of this.lookup.keys()){
      if(i === r) {
        break;
      }
      i++;
    }

一切都很好。

你需要声明它以避免隐式全局,但你不需要初始化它(你不需要给它赋值)。

我猜你的 IDE 已经很好地分析了你的代码,知道 this.lookup.keys() 至少有一个元素,所以 k 永远不会留在 null,并且有首先分配它 null 毫无意义;尽管我不认为这是有问题的(如果将来 this.lookup 被修改为空并且您希望此函数为 return null 而不是 undefined 怎么办案例.

您的 IDE 也可能认为任何赋值 null 的变量声明语句都是多余的,因为它不区分 nullundefined。不过,这完全是 IDE 中的一个错误。