for(var i = 0; i < 100; i++){
var foo = 5;
}
它有效......但是这很糟糕吗?
我知道我可以在外面声明var foo
,但为什么在我只打算在循环中使用它时呢?
答案 0 :(得分:4)
随着时间的推移,我的个人风格已经变得偏向于在我正在使用的特定语言的“思维”中声明他们“实际上”的变量。对于JavaScript,这意味着将变量和函数声明放在其中的位置无论如何,语言都会提升它们。
这是为了清晰,准确的沟通,理解,可维护性,以保持我自己的心理过程与语言的过程平行,只是提到一些很好的理由。
所以在这种特殊情况下,我不会将var foo = 5;
声明放入for
循环的主体中,原因很简单,因为它没有做它看起来正在做的事情,即,实际上并不是每次迭代都要重新声明/重新定义变量。 (将var
声明放在for循环标题的初始化部分(初始化;条件;事后补充)会更合理,而且肯定是将它放入有语言的正确位置块级变量,例如当JavaScript完成对块级范围采用let
- 样式声明时。)
注意:
这种做法似乎并不“正常”。我的思维倾向于保持变量“接近”它们的使用,而我现在的做法并不是我思想工作的方式。但作为一名多年来的程序员,经验混乱,沟通不畅,误解,不可维护的代码无法解开等等,除了证明在我们对应的位置上遵循这种声明变量的方式时,我还有更多的理由。实际范围,不论语言如何。
这种做法的另一个好处是,它鼓励我保持我的功能模块化和合理的尺寸。
沿着同样的路线,遵循这种做法会自动帮助我以合理的方式组织我的代码。例如,如果首先放置我的函数会导致在我实际处理的代码之前出现过多的函数,因此我不得不下两页来编辑我的程序,因此遵循此样式会激励我组织我的将代码编码到不同文件的适当结构中。
P.S。人们可以提出一些观点,即某些函数太长,以至于这种做法使得变量声明最终会使页面远离它们的使用位置。是的,我已经看到代码在哪里是真的,甚至可能代码无法帮助的代码。然而,我无法观察到对于散文作者和计算机程序员同样如此的平行。随着技能水平的提高,作者句子的长度(以及程序员函数的大小)趋于增长,然后随着技能水平的不断提高,句子的长度(以及程序员函数的大小)往往会缩短一次更多。
答案 1 :(得分:3)
这很糟糕,因为它给人的错误印象是i
和foo
是局部变量。
for(var i = 0; i < 100; i++){
var foo = 5;
}
foo; // 5
这可能不是简单代码的问题,但如果使用闭包,很明显只有一个foo
:
var counters = [];
for (var i = 0; i < 100; i++) {
var foo = 5;
counters.push(function() { foo++; return foo; });
}
counters[0](); // 6
counters[0](); // 7
counters[1](); // 8 (!)
要在不同的范围内创建foo
,需要引入一个函数:
var counters = [];
for (var i = 0; i < 100; i++) {
(function() {
var foo = 5;
counters.push(function() { foo++; return foo; });
})();
}
counters[0](); // 6
counters[0](); // 7
counters[1](); // 6
以下是由此引发的错误的真实示例:setTimeout in for-loop does not print consecutive values
从JavaScript 1.7开始,您可以使用let
关键字(请参阅MDN)来创建真正的局部变量。