我有一种习惯,即我处于边缘强迫状态,但我认为可能完全没有必要。代码如下:
function abc(){
var a,b;
for(var i=0;i<10;i++){
a=document.getElementsByTagName('LI').item(i).width;
b=document.getElementsByTagName('DIV').item(i).width;
// now do something with a and b
}
return;
}
我强烈要求在循环之前声明变量而不是:
function abc(){
for(var i=0;i<10;i++){
var a=document.getElementsByTagName('LI').item(i).width;
var b=document.getElementsByTagName('DIV').item(i).width;
// now do something with a and b
}
return;
}
请注意,在第二个代码块中,每次循环迭代时,我都会使用var
定义变量。我想第一个是可读性等方面的最佳实践。但有时我只是在黑客攻击并且不需要遵循最佳实践。
我的问题是:
是否有任何理由不来定义一个将在循环中使用var
关键字重新定义的变量?
答案 0 :(得分:13)
由于Javascript中的变量提升,位于函数顶部的var
或for
循环内部的执行之间没有技术差异。如果这就是你所关心的,那么你可以这样做。
只是为了刷新内存,Javascript提升意味着解析像你的第二个代码块一样的代码,然后就像你的第一个代码块一样执行。函数中的所有var
声明在执行前自动移动到函数作用域的顶部。这些变量的赋值保存在代码中的位置 - 只需移动变量的声明。
所以,差异更多的是你想要编码的样子。当您将var
定义放在for
循环中时,它会使代码看起来像for
循环的每次迭代都重新创建变量,即使不是这种情况。它们在循环的每次迭代中被赋值,但是不创建新变量。如果您使用let
而不是var
,那就是这种情况,因为let
具有块范围,而var
只有函数范围。
通常,将代码放在实际需要在循环内部的循环中是一个好习惯。虽然它实际上并没有改变执行中的任何内容,无论var
是在循环内部还是外部,它只是一个好习惯的一部分,而其他代码在循环内部或外部可能会产生影响。
在你的情况下,我认为这是一个更好的做法:
function abc(){
var liTags = document.getElementsByTagName('LI');
var divTags = document.getElementsByTagName('DIV');
var len = Math.min(liTags.length, divTags.length);
var a,b;
for(var i = 0; i < len; i++){
a = liTags[i].width;
b = divTags[i].width;
// now do something with a and b
}
return;
}
在这里,您已从循环中删除了对document.getElementsByTagName()
的两次调用,这将产生巨大的性能差异。
2017年更新。 Javascript版本ES6,现在支持const
和let
来声明变量。它们是块作用域,而不是像var
那样的函数作用域,所以如果你在for
循环块中声明其中一个,那么将为每个{{1}调用创建一个新的单独变量循环。虽然这不会对您显示的代码类型产生任何重大的执行差异,但如果您在循环内部引用了您声明的变量的异步代码,则可能会有所不同。在循环体中使用for
或const
的情况下,每个异步调用都会获得它自己的变量的单独副本,这有时非常方便。
let
答案 1 :(得分:3)
我知道这个答案不会对您的问题有所帮助,它只是一个建议,但我认为,当您和&#c}元素放入变量DOM
时,这是一个很好的做法。 #39;重新访问它多次。这样做可以避免每次都在DOM
上进行迭代。
function abc() {
var a = document.getElementsByTagName('LI'),
b = document.getElementsByTagName('DIV');
for ( var i = 0; i < 10; i++ ) {
a.item(i).width;
b.item(i).width;
// now do something with a and b
}
return;
}