我有以下功能:
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.
这有什么问题?为什么在同一函数中为每个循环使用其他变量很重要?在这种情况下,这是我应该关心的问题吗?
答案 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;
};
或者,如果all
和otherAll
是数组,请查看forEach
或my 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 )。
或者,如果您不需要索引并且只需要循环中的值,并且all
和otherAll
是可迭代的(数组是可迭代的),请使用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);