处理多个for循环中声明的变量的最惯用方法是什么?

Kat*_*Kat 12 javascript idioms

JavaScript只有函数范围.因此,for循环中声明的变量对于整个函数是可见的.

例如,

function foo() {
    for(var i = 0; i < n; i++) {
        // Do something
    }
    // i is still in scope here
}
Run Code Online (Sandbox Code Playgroud)

当我们有多个for循环时,这就打开了我们如何处理这些其他for循环中的变量的问题.

我们使用不同的变量吗?

for(var i = 0; i < n; i++) { }
for(var j = 0; j < n; j++) { }
Run Code Online (Sandbox Code Playgroud)

或者我们使用相同的变量,但只是分配一个值(而不是声明它)?

for(var i = 0; i < n; i++) { }
for(i = 0; i < n; i++) { }
Run Code Online (Sandbox Code Playgroud)

或者i在循环之外声明?

var i;
for(i = 0; i < n; i++) { }
for(i = 0; i < n; i++) { }
Run Code Online (Sandbox Code Playgroud)

还是重新声明i

for(var i = 0; i < n; i++) { }
for(var i = 0; i < n; i++) { }
Run Code Online (Sandbox Code Playgroud)

所有这些工作(或至少他们在我的浏览器的最新版本上).但是,JSHint并不喜欢最后一种方法.

是否有一种最惯用或更优选的方法?

meg*_*wac 3

这实际上取决于您为谁编码。如果您正在为公司编码或为图书馆做出贡献,您当然会遵循他们的风格指南。我已经在图书馆中看到了所有这些(包括最后一个)。如果您喜欢 Douglas Crockford 风格,您可以选择倒数第二个,并将所有变量放在函数作用域的顶部(否则 jslint 会冲您喊叫)。

以jQuery 样式指南为例:

这被认为是很好的风格

var i = 0;

if ( condition ) {
    doSomething();
}

while ( !condition ) {
    iterating++;
}

for ( ; i < 100; i++ ) {
    object[ array[ i ] ] = someFn( i );
}
Run Code Online (Sandbox Code Playgroud)

虽然这是糟糕的风格

// Bad
if(condition) doSomething();
while(!condition) iterating++;
for(var i=0;i<100;i++) object[array[i]] = someFn(i);
Run Code Online (Sandbox Code Playgroud)

无论如何,因为这是风格,我将参考几个库如何为每个循环编写它们:

如果您的代码在发布之前要最小化,那么这并不重要,因为压缩器会在处理过程中将其破坏为几乎相同的最终表示形式。