提问者:小点点

在多个for循环中使用相同的变量名是不是不好?


我只是使用 JSHint 浏览一些 JavaScript 代码。在代码中,我有两个 for 循环,都像这样使用:

for (var i = 0; i < somevalue; i++) { ... }

所以两个for循环都使用变量I进行迭代。

现在JSHint向我显示了第二个for循环的错误:“i”已经定义了”。我不能说这不是真的(因为它显然是真的),但我一直认为这并不重要,因为var i只在特定的地方使用。

这样使用for循环是不好的做法吗?我应该为代码中的每个for循环使用不同的变量吗

//for-loop 1
for (var i = 0; ...; i++) { ... }

//for-loop 2
for (var j = 0; ...; j++) { ... }

或者这是我可以忽略的错误(因为它不会破坏我的代码,它仍然做它应该做的事情)?

顺便说一句,JSLint在第一个for循环中停止验证,因为我没有在函数的顶部定义var I(这就是为什么我首先切换到JSHint)。因此,根据这个问题中的示例:我应该使用JSLint或JSHint JavaScript验证吗无论如何,我应该使用这样的for循环来确认JSLint:

...
var i;
...
//for-loop 1
for (i = 0; ...; i++) { ... }
...
//for-loop 2
for (i = 0; ...; i++) { ... }

这对我来说也不错,因为这样我应该避免 JSLint 和 JSHint 中的两个错误。但我不确定的是我是否应该像这样为每个 for 循环使用不同的变量:

...
var i, j;
...
//for-loop 1
for (i = 0; ...; i++) { ... }
//for-loop 2
for (j = 0; ...; j++) { ... }

那么,这是否有一个最佳实践,或者我可以使用上面的任何代码,这意味着我选择了“我的”最佳实践?


共3个答案

匿名用户

由于变量声明被提升到它们出现的范围的顶部,解释器将以相同的方式有效地解释这两个版本。出于这个原因,JSHint 和 JSLint 建议将声明移出循环初始化器。

以下代码。。。

for (var i = 0; i < 10; i++) {}
for (var i = 5; i < 15; i++) {}

…有效地解释为:

var i;
for (i = 0; i < 10; i++) {}
for (i = 5; i < 15; i++) {}

请注意,实际上只有一个 i 声明,并且有多个赋值 - 您不能真正“重新声明”同一范围内的变量。

要真正回答你的问题。。。

有没有最佳实践,或者我可以使用上面的任何代码吗?

关于如何最好地处理这一问题,有不同的意见。就我个人而言,我同意JSLint的观点,并认为当您在每个范围的顶部一起声明所有变量时,代码会更清晰。既然这就是代码的解释方式,为什么不编写看起来像它的行为的代码呢?

但是,正如您所观察到的,无论采用何种方法,代码都将工作,因此这是一种风格/约定的选择,您可以使用您觉得最舒服的任何形式。

匿名用户

只有在@TSCrowder的评论中提到过:如果您的环境支持它(Firefox,Node.js),那么在ES6中,您可以使用let声明

//for-loop 1
for (let i = 0; ...; i++) { ... }

//for-loop 2
for (let i = 0; ...; i++) { ... }

这将范围限制在for循环内。额外收获:JSHint停止抱怨。

匿名用户

javascript中的变量是函数范围的(不是块范围的)。

当您在循环中定义var i时,它会保留在循环中以及具有该循环的函数中。

见下文,

function myfun() {
    //for-loop 1
    for (var i = 0; ...; i++) { ... }

    // i is already defined, its scope is visible outside of the loop1.
    // so you should do something like this in second loop.

    for (i = 0; ...; j++) { ... }

    // But doing such will be inappropriate, as you will need to remember
    // if `i` has been defined already or not. If not, the `i` would be global variable.
}