Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中为创建循环时,我必须在哪里声明变量?_Javascript - Fatal编程技术网

在javascript中为创建循环时,我必须在哪里声明变量?

在javascript中为创建循环时,我必须在哪里声明变量?,javascript,Javascript,在javascript中创建“for循环”时,我看到了两种声明变量的不同方式: 第一种方式: for (var i = 0, l = [].length; i < l; i += 1) { // make something } for(变量i=0,l=[].length;i

在javascript中创建“for循环”时,我看到了两种声明变量的不同方式:

第一种方式:

for (var i = 0, l = [].length; i < l; i += 1) {
    // make something
}
for(变量i=0,l=[].length;i
第二种方式:

var i;
var l;
for (i = 0, l = [].length; i < l; i += 1) {
    // make something
}
vari;
变种l;
对于(i=0,l=[].length;i

有什么理由选择其中一种吗?

鉴于您展示的代码,它们是一样的。然而,JS有一些奇怪之处,这可能会在更复杂的代码中引起问题。此外,对于未来的开发人员来说,还存在可维护性和可读性的问题。有些是非常主观的,有些是客观的

我使用了两种方法的组合,只是略有不同——单个var语句,位于范围的顶部

var x = function () {
    var i,
      l;

    for (i = 0, l = [].length; i < l; i += 1) {
        // make something
    }
};
var x=函数(){
var i,
L
对于(i=0,l=[].length;i

原因是我更喜欢每个作用域(函数)使用一条var语句,并且该语句位于作用域的顶部。JSLint/JSHint默认情况下强制执行此操作。客观上,它有助于避免JS提升机制的问题,JS提升机制在预执行过程中将所有变量声明移动到范围的顶部。诚然,主观上,它让后来的开发人员非常清楚在这个范围内引入了哪些变量。假设范围中使用的任何其他var来自更高级别的范围。

它们是相同的,您可以使用其中一个,但第一个更具可读性和简洁性

关键是,这两种情况下的变量都是局部变量,存在
var
关键字。使用第一种方法,还可以创建两个局部变量:

var i, l
而不是

var i
var l

当只有一个人可以做的时候,为什么要一次又一次地使用
var
关键字呢。事实上,这是JS的一个良好实践。

不,这两个都是正确的。我自己更喜欢第一个

不正确的方法是:

for (var i = l = 0; ...; ...) {
    ...
}

如果i和l之间没有逗号,则l是全局的。

不,至少在Chrome中,范围是完全相同的,并且两种方式都是等效的。

在javascript中,除了从可维护性的角度来看,没有区别。将声明和用法放在附近有助于提高可读性。你应该选择哪一个更可读。

之所以选择第二个而不是第一个,是因为JS中的变量没有块作用域,而是词法(或函数)作用域,这意味着变量在定义的函数中可见(在嵌套函数中也可见)

例如:

function foo() {
    for (var i = 0; i < 10; i++) {
        alert(i);
    }

    alert(i); // works, because i has lexical scope
}
函数foo(){
对于(变量i=0;i<10;i++){
警报(一);
}
alert(i);//有效,因为我有词法作用域
}
在大多数类似C的语言中,变量具有块作用域,这意味着它们在定义它们的块中可见,因此:

void foo() {
    for (int i = 0; i < 10; i++) {
        print(i);
    }
}

print(i); // won't work, i is not visible any more
void foo(){
对于(int i=0;i<10;i++){
印刷品(一);
}
}
打印(i);//不行了,我再也看不见了
因此,来自Java/C/C++等语言的人可能认为第一个示例中的VARI具有块作用域,而实际上没有。这就是为什么一些程序员喜欢在函数的开头声明所有变量

就我个人而言,我认为即使这样,你也应该坚持这个习惯,尽可能地在使用变量的地方声明变量

编辑


正如JAAulde所提到的,如果你真的了解JS范围规则(和怪癖),你应该只声明接近其用法的变量。

实际上,根据万能的规则:因为javascript有函数范围,所以最好总是首先在函数头声明变量


但是,正如其他人所指出的,这并不重要,应该根据个人喜好和可读性来做。

他的第一个方法也使用了single
var
,这与您所做的相同。@Sarfraz single var语句用于整个函数,而不仅仅是循环。@Sarfraz True,但不在范围的顶部,这就是我这么说的原因。我会编辑说我使用了这两个变量的组合…@JAAulde:Ok有道理,但我想不应该在顶部定义面向循环的变量。@Sarfraz我总是在顶部声明它们,有时也在顶部定义它们。这要视情况而定。坚持“声明接近使用”的唯一问题是JS不是C。JS有一个提升机制,这是一个奇怪的现象,当var声明在没有正确理解该机制的情况下到处进行时,可能会导致问题。