在javascript中创建“for循环”时,我看到两种不同的方式来声明变量:
第一种方式:
for (var i = 0, l = [].length; i < l; i += 1) {
// make something
}
第二种方式:
var i;
var l;
for (i = 0, l = [].length; i < l; i += 1) {
// make something
}
是否有理由更喜欢其中一种?
答案 0 :(得分:2)
鉴于您展示的代码,它们是相同的。然而,JS有一些奇怪的东西,可能会导致更复杂的代码问题。此外,还存在未来开发人员的可维护性和可读性问题。其中一些是非常主观的,一些是客观的。
我使用两者的组合,略有变化 - 单个var语句,范围顶部。
var x = function () {
var i,
l;
for (i = 0, l = [].length; i < l; i += 1) {
// make something
}
};
原因是我更喜欢每个范围(函数)的单个var语句,并且该语句位于范围的顶部。 JSLint / JSHint默认强制执行此操作。客观上,它有助于避免JS提升机制的问题,该机制在执行前传递期间将所有变量声明移动到范围的顶部。不可否认,主观上,后来的开发人员非常清楚在这个范围内引入了哪些变量。假定范围中使用的任何其他var都来自更高级别的范围。
答案 1 :(得分:2)
它们是相同的,你可以使用BUT首先更具可读性和简洁性。
关键是两种情况下的变量都是本地的,并且存在var
关键字。使用第一种方法,您还可以创建两个局部变量:
var i, l
而不是
var i
var l
为什么只有一个人可以一次又一次地使用var
关键字。事实上,这是JS的良好实践之一。
答案 2 :(得分:1)
不,这两个都是正确的。我更喜欢第一个自己。
不正确的方法是:
for (var i = l = 0; ...; ...) {
...
}
i和l之间没有逗号,导致l为全局。
答案 3 :(得分:1)
在javascript中除了从可维护性的角度来看没有区别。保持声明和使用接近有助于提高可读性。你应该选择哪种更具可读性。
答案 4 :(得分:0)
不,至少在Chrome中,范围完全相同,两种方式都是等效的。
答案 5 :(得分:0)
为什么人们更喜欢第二个的原因是JS中的变量没有块范围,而是词法(或函数)范围,这意味着变量在它们被定义的函数中是可见的(它们是在嵌套函数中也可见。)
示例:
function foo() {
for (var i = 0; i < 10; i++) {
alert(i);
}
alert(i); // works, because i has lexical scope
}
在大多数类C语言中,变量具有块范围,这意味着它们在定义它们的块中可见,因此:
void foo() {
for (int i = 0; i < 10; i++) {
print(i);
}
}
print(i); // won't work, i is not visible any more
因此,来自Java / C / C ++等语言的人可能会认为第一个示例中的var i具有块范围,而实际上并没有。这就是为什么有些程序员喜欢在函数开头声明所有变量的原因。
就我个人而言,即便如此,你应该坚持使用尽可能接近变量的习惯。
修改强>
正如JAAulde所提到的,如果你真的了解JS范围规则(和怪癖),你应该只声明接近其用法的变量。
答案 6 :(得分:0)
实际上根据全能的crockford有:因为javascript具有函数作用域,所以总是首先在函数的头部声明变量。
但是,正如其他人所指出的那样,它并不重要,应该根据个人品味和可读性来做。