已经为具有多个for循环的函数定义了错误

时间:2016-10-04 15:45:36

标签: javascript jshint

我有以下功能:

self.aFunction = function(otherAll, all){
    for(var i = 0; i < all.length; i++){
        ...
    }
    for(var i = 0; i < otherAll.length; i++){
        ...
    }
    return someResult;
};

我有两个for循环,它们都使用变量“i”。它们没有任何共同点,并且分别用于每个循环。

但是,我从jshint中获取以下错误:

'i' is already defined.

这有什么问题?为什么在同一函数中为每个循环使用其他变量很重要?在这种情况下,这是我应该关心的问题吗?

1 个答案:

答案 0 :(得分:4)

用实用的术语来说,在你的例子中重复使用相同的变量是很好的,但是通过声明它两次,你给人的印象是你认为它的范围是for循环。它不是,这就是JSHint给你注意的原因:确保它实际上不是代码中的错误。

如果您想重复使用i,只需声明一次:

self.aFunction = function(otherAll, all){
    var i;
    for(i = 0; i < all.length; i++){
        ...
    }
    for(i = 0; i < otherAll.length; i++){
        ...
    }
    return someResult;
};

或者,如果allotherAll是数组,请查看forEachmy other answer here中的许多其他选项。

IF 您可以使用ES2015功能(例如,您知道所有目标环境都支持它们,或者您正在进行转换),然后:

您可以使用let

self.aFunction = function(otherAll, all){
    for(let i = 0; i < all.length; i++){
        ...
    }
    for(let i = 0; i < otherAll.length; i++){
        ...
    }
    return someResult;
};

i 声明的let限定为for循环(以非常有趣的方式,不少于 1 )。

或者,如果您不需要索引并且只需要循环中的值,并且allotherAll是可迭代的(数组是可迭代的),请使用let和新的for-of

self.aFunction = function(otherAll, all){
    for(let value of all){
        ...
    }
    for(let value of otherAll){
        ...
    }
    return someResult;
};

1 “...以一种非常有趣的方式,同样......”for (let i = 0; i < all.length; i++)实际上有一个不同 i用于每个循环迭代,它在循环的增量部分之前从前一个i的值获取其值,这在循环中创建闭包时很有用 - 它们关闭该迭代的i

// let...
for (let i = 0; i < 5; ++i) {
  setTimeout(function() {
    console.log("i = " + i);
  }, i * 100);
}

// ...vs. var
setTimeout(function() {
  for (var j = 0; j < 5; ++j) {
    setTimeout(function() {
      console.log("j = " + j);
    }, j * 100);
  }
}, 500);