在多个for循环中重新声明变量- for(var i ..)

Re-declaring variable in multiple for loops - for(var i ...)

本文关键字:for 声明 变量 var 新声明 循环      更新时间:2023-09-26

过去我使用这样的write for循环:

// Count to 10
for(var i = 1; i <= 10; i++) {
    console.log(i);
}
var message = "We're done here!";
// Count down by 10's from 100
for(var i = 100; i >= 0; i -= 10) {
    console.log(i);
    if(i === 0) {
        alert(message);
    }
}

然后,在没有通过所有语法代码检查器并被告知不要重新声明变量之后,我最终像这样编码,在每个作用域的顶部使用单个var语句:

var i,  message = "We're done here!";
// Count to 10
for(i = 1; i <= 10; i++) {
    console.log(i);
}
// Count down by 10's from 100
for(i = 100; i >= 0; i -= 10) {
    console.log(i);
    if(i === 0) {
        alert(message);
    }
}

就我个人而言,当您不必担心是否声明了i时,保留var似乎会使代码更易于维护。我在多个var声明中看到过类似的问题。如果解释器只是简单地忽略附加声明,并将其视为赋值,我不明白为什么这可能是一件坏事。

那么,如果忽略所有的约定和样式指南,在每个循环中重新声明i是否可能导致任何问题,性能或其他方面的?

(除了语法检查失败和Douglas Crockford生你的气)。

所以,如果你忽略所有的约定和风格指南,可以在每个循环中重新声明I可能会导致任何问题,表演还是其他?

不,它不会在运行时引起任何问题或影响性能。

范围内的所有var声明都被提升到块的顶部(在该块中运行任何代码之前),因此任何dup只是组合在一起。解析器会忽略重复的声明。

我能想到的唯一缺点是它增加了代码的大小(额外的var),而不是在顶部组合所有的var声明。但是,如果您运行最小化程序,则应该删除额外的大小。

警告一般风格建议可能是因为重复的var声明会导致读者或编码人员意外地认为他们正在声明一个新的,未使用的局部变量,而实际上,该变量已经在使用中,并且可能已经有一个值,并且其他代码可能已经在使用该变量。如果你知道情况并非如此,那么它除了可能使你更容易无意中犯那个错误之外,并没有什么害处。

供参考,对于for循环,ES6用let声明解决了这个问题,当在for循环初始化器中使用时,将声明一个唯一作用域为for循环的变量。

// Count to 10
for (let i = 1; i <= 10; i++) {
    // i is scoped to within this loop only
    console.log(i);
}
// Count down by 10's from 100
for (let i = 100; i >= 0; i -= 10) {
    // i is scoped to within this loop only
    console.log(i);
    if(i === 0) {
        alert(message);
    }
}

对于我的个人风格,我发现如果我保留var声明和for循环,即使我重用相同的变量(更容易移动代码并查看声明在哪里),我的代码更易于维护。我只是发现每个循环都更加独立。而且,如果我试图在for循环之外使用循环变量,我会以不同的方式声明它(在循环之外)。显然,如果我在ES6环境中,我将为for循环变量使用let

我避免在函数中重新声明任何其他变量,因为这看起来更像是一个错误,而不是有目的的意图,并且重新声明它似乎很少对维护有好处。