Javascript 在多个for循环中使用相同的变量名是一种不好的做法吗?

Javascript 在多个for循环中使用相同的变量名是一种不好的做法吗?,javascript,for-loop,jslint,jshint,Javascript,For Loop,Jslint,Jshint,我只是用JSHint编写了一些JavaScript代码。在代码中,我有两个for循环,都是这样使用的: for (var i = 0; i < somevalue; i++) { ... } ... var i, j; ... //for-loop 1 for (i = 0; ...; i++) { ... } //for-loop 2 for (j = 0; ...; j++) { ... } 或者这是我可以忽略的错误之一(因为它没有破坏我的代码,它仍然做它应该做的事情) 顺便说一句

我只是用JSHint编写了一些JavaScript代码。在代码中,我有两个for循环,都是这样使用的:

for (var i = 0; i < somevalue; i++) { ... }
...
var i, j;
...
//for-loop 1
for (i = 0; ...; i++) { ... }
//for-loop 2
for (j = 0; ...; j++) { ... }
或者这是我可以忽略的错误之一(因为它没有破坏我的代码,它仍然做它应该做的事情)

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

...
var i;
...
//for-loop 1
for (i = 0; ...; i++) { ... }
...
//for-loop 2
for (i = 0; ...; i++) { ... }
这对我来说也很好,因为这样我应该避免JSLint和JSHint中的错误。但我不确定的是,我是否应该为每个for循环使用不同的变量,如下所示:

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

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

最佳实践是减少变量的范围,因此为循环声明迭代变量的最佳方法是

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

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

我知道用
var
声明的变量的范围,但我在这里讨论的是代码的可读性。

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

下面的代码

for (var i = 0; i < 10; i++) {}
for (var i = 5; i < 15; i++) {}
for(var i=0;i<10;i++){
对于(var i=5;i<15;i++){}
。。。有效地解释为:

var i;
for (i = 0; i < 10; i++) {}
for (i = 5; i < 15; i++) {}
vari;
对于(i=0;i<10;i++){}
对于(i=5;i<15;i++){}
请注意,
i
实际上只有一个声明,并且有多个赋值-您不能在同一范围内真正“重新声明”变量

要回答你的问题

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

对于如何最好地处理这一问题,有不同的看法。就我个人而言,我同意JSLint,并且认为当您在每个作用域的顶部一起声明所有变量时,代码更加清晰。既然这就是代码的解释方式,为什么不编写看起来与其行为一致的代码呢


但是,正如您所观察到的,无论采用何种方法,代码都会工作,因此这是一种风格/惯例选择,您可以使用您最喜欢的任何形式。

JSHint显示错误的原因是,在JS中,变量作用域是函数,变量声明被提升到函数顶部

在Firefox中,您可以使用
let
关键字定义块范围,但目前其他浏览器不支持


ECMAScript 6规范中包含了
let
关键字。

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.
}

我知道这个问题已经得到了回答,但如果您想要超级for循环,请这样写:

var names = ['alex','john','paul','nemo'],
    name = '',
    idx = 0,
    len = names.length;

for(;idx<len;++idx)
{
    name = names[idx];
    // do processing...
}
var name=['alex'、'john'、'paul'、'nemo'],
名称=“”,
idx=0,
len=name.length;

对于(;idx),只有在:如果您的环境支持它(Firefox,Node.js),那么在ES6中您可以使用


将作用域限制在for循环内。另外:JSHint停止抱怨。

除了在JavaScript中不是这样。
var
总是有函数作用域(或者全局作用域,如果在所有函数之外)。它没有块作用域。在ES6中,我们将有
let
(一旦它得到广泛实现),在这一点上,这是一个可行的答案。但在当今世界,这是毫无意义的,
var
,并且是误导性的。@Nikolay:是的,是的,如果声明实际发生在哪里,不管你放在哪里。做任何不同的事情都会导致误导。主动误导阅读你的代码的人不能被称为“最佳实践”。最佳实践是保持函数足够短,以便在顶部声明变量时定义它们接近使用它们的位置。@Nikolay:“谢谢你的缺点,但我正在考虑代码可读性”我也是。因此,我怀疑,有一些人会说这没有用。在你使用它之前“,你读过我上面的评论了吗?保持函数简短,这样顶部的变量就接近它们的使用位置。
最佳做法是保持函数足够简短,这样在顶部声明变量就是在接近它们的使用位置定义它们。
。这应该是用任何语言编写代码的方式。我不同意下层选民的观点。”在特定语言中,作用域比具体的作用域规则重要得多(var i…
我告诉读者,
i
将在这个块中使用,而不会在其他地方使用。是的,从技术上讲,它并没有限制
i
的范围,而是明确了意图。我想我最喜欢这种方法,因为我同意你说的“为什么不编写看起来像它的行为的代码?”。它非常清晰易读。我想我会熟练掌握这种风格。我更愿意在循环头中声明我的循环迭代器,因为它非常清楚变量的用途,因为循环迭代器是历史上简单的非描述性名称,如
I
j
。如何避免使用对于多个循环,使用与迭代器相同的变量。?对于多个循环,不要使用与迭代器相同的变量。要么声明多个迭代器变量,要么不要在同一块中执行多个循环。我个人认为,如果将每个循环分解为其自己的帮助函数,则最具可读性,然后可以在两个循环中使用
I
。是的,this很容易被弄糊涂(比如为什么它在第一个循环中声明,而不是在第二个循环中声明)。但是在这种情况下,如果第一个循环被删除,第二个循环最终会泄漏到全局