有这两个选项:
选项A:
var index;
for (index in myObject) {
// Do something
}
选项B:
for (var index in myObject) {
// Do something
}
我不知道在选项B中变量index
是否在每次循环时重新声明,或者只是一次。
答案 0 :(得分:4)
这两段代码完全相同(在大多数语言中就是这种情况,例如C,C ++和C#等)。如果变量在每次迭代时重新声明,那么遵循您的逻辑,它也将被重新初始化,并且将不断循环遍历同一个对象。你的循环将是无限的。
在旁注中,在JavaScript中,所有变量声明都被推送到函数范围;这意味着您可以在函数内的任何位置声明变量,即使在嵌套循环中也是如此,并且它们只会被声明一次。
编辑@torazaburo的礼貌:
如果要声明具有局部范围的变量(例如,仅在当前块中定义的变量,例如for
,while
或if
,您可以使用let
声明:
let var1 = 123;
它还允许您覆盖具有相同名称但在更高范围内声明的变量,例如在此示例中来自docs:
function letTest() {
let x = 1;
if (true) {
let x = 2; // different variable
console.log(x); // 2
}
console.log(x); // 1
}
请参阅完整文档(和示例)here。
答案 1 :(得分:2)
2016年的首选方法是使用let
在循环头中声明变量:
for (let i = 0; i < max; i++) { }
^^^
这种方法和其他方法之间的性能差异可能很小,但在代码的健壮性和清晰度方面有很大的优势。
首先,对于let
,i
是for
构造的本地,因此它不会泄漏&#34;或修改其他i
{1}}在外部范围内。
其次,也许更重要的是,为循环的每次迭代创建了新版本的i
。从技术角度来说,如果你让一个变量&#34;那么,每次迭代都会得到一个新的绑定。 (见this excellent article)。这解决了使用最终值i
在for循环内创建的闭包的古老问题。我们现在可以写
for (let i = 0; i < 10; i++) {
setTimeout(() => alert(i), i * 1000);
}
而不是做一些笨拙的解决方法,如
for (var i = 0; i < 10; i++) {
(function(i) {
setTimeout(() => alert(i), i * 1000);
}(i));
}
这是SO上无数问题的主题,你们中的许多人浪费了太多的脑循环学习。