在javascript中进行循环时,我必须在哪里声明变量?

时间:2012-02-21 15:09:59

标签: javascript

在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
}

是否有理由更喜欢其中一种?

7 个答案:

答案 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具有函数作用域,所以总是首先在函数的头部声明变量。

但是,正如其他人所指出的那样,它并不重要,应该根据个人品味和可读性来做。