考虑以下JavaScript:
for (var i = 0; i < foo.length; i++) {
DoStuff(foo[i]);
}
for (var i = 0; i < bar.length; i++) {
DoStuff(bar[i]);
}
Run Code Online (Sandbox Code Playgroud)
作为一名来自C#背景的开发人员,这段代码对我来说似乎很好.不幸的是,此代码会使用Visual Studio生成警告.
消息1'i'已定义
好的,当然.很明显发生了什么 - 我的第一个声明并没有将我的范围限制在for循环的范围内.我可以做几件事:
for (var i = 0; i < foo.length; i++) {
DoStuff(foo[i]);
}
for (i = 0; i < bar.length; i++) {
DoStuff(bar[i]);
}
Run Code Online (Sandbox Code Playgroud)
我发现这个解决方案不正确,因为第二个for循环现在的'正确性'与第一个循环的'正确性'耦合 - 如果我删除第一个循环,第二个循环必须改变.或者:
for (var fooIndex = 0; i < foo.length; i++) {
DoStuff(foo[fooIndex]);
}
for (var barIndex = 0; barIndex < bar.length; barIndex++) {
DoStuff(bar[barIndex]);
}
Run Code Online (Sandbox Code Playgroud)
这似乎更好,是我目前所确定的,但我对潜在的长名称不满意.我使我的索引的命名标准依赖于它们迭代的变量来保证唯一的名称声明.不幸的是,如果我有一个名为"potentialDiagramImages"的列表,我真的不想这样做:
foreach(var potentialDiagramImagesIndex in potentialDiagramImages){
var foo = potentialDiagramImages[potentialDiagramImagesIndex];
}
Run Code Online (Sandbox Code Playgroud)
这开始在我的眼中"太长的变量名".不过,我不知道SO是否同意我的意见.此外,如果我必须在同一范围内两次迭代相同的列表(无论出于何种原因),那么这个实现仍然存在初始问题.
无论如何,我只是好奇别人如何解决这个范围的困境.
i在循环之前声明(在函数体的顶部):
var i;
for (i = 0; i < foo.length; i++) {
DoStuff(foo[i]);
}
for (i = 0; i < bar.length; i++) {
DoStuff(bar[i]);
}
Run Code Online (Sandbox Code Playgroud)