在过去,我使用了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);
}
}
就个人而言,保持var
似乎会使代码更易于维护,而不必担心是否声明了i
。我在multiple var
statements看到了类似的问题。如果解释器只是忽略了附加声明,并将其视为一项任务,我不明白为什么它可能是一件坏事。
因此,如果您忽略所有约定和样式指南,可以在每个循环中重新声明i
,可能会导致任何问题,性能或其他方面?
(除了说法语检查失败,道格拉斯克罗克福德对你生气)。
答案 0 :(得分:4)
因此,如果您忽略所有约定和样式指南,则可以 在每个循环中重新声明我可能会导致任何问题, 表现还是其他?
不,它不会在运行时导致任何问题或影响性能。
范围内的所有var
声明都被提升到块的顶部(在该块中运行任何代码之前),因此任何重复都只是组合在一起。解析器只是忽略了重复的声明。
我能想到的唯一缺点是,它会在代码中添加更多的大小(额外var
),而不是在顶部组合所有var
声明。但是,如果您运行最小化器,则应删除该额外大小。
警告和一般风格建议可能是因为重复的var
声明可能会导致读者或编码人员意外地认为他们正在声明新的,未使用的实际上,当变量已经在使用并且可能已经有一个值而某些其他代码可能已经在使用该变量时,本地变量。如果您知道情况并非如此,那么除了可能使您更容易意外地犯错之外,它不会造成伤害。
仅供参考,对于for
循环,ES6使用let
声明来解决此问题,当在for
循环初始化程序中使用时,它将声明一个唯一作用域的变量for
1}}循环。
// 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环境中,我会使用let
作为for
循环变量。
我避免重新声明函数中的任何其他变量,因为它似乎更有可能是错误而不是有目的的意图,并且似乎很少有重新声明它的维护优势。