在JavaScript中,在for循环中声明多个变量

4

以下是JavaScript代码:

// note: declaring i in this loop
for( var i=0; i<args.length; i++ ) {

   var elem = args[i];
   ...

   if( elem.attr == 'class' ) {

        // note declaring arr and i in this loop
        for( var arr=elem.val.split(' '), i=0; i<arr.length; i++ ) {

            element.classList.add(arr[classCt]);
        }
        continue;
    }
}

问题在于第二个for循环中的 i 与第一个for循环中声明的 i 是相同的。
虽然 var 结构允许通过逗号分隔声明多个变量,但这并不能解决问题。
当将第二个循环中的 i 更改为 classCt 时,代码按预期工作。

1
当我在第二个循环中将“i”更改为“classCt”时,代码按预期工作了 - 那你为什么不采用这种方法呢? - Niko
在哪里将i更改为classCt?第二个for循环中的i确实与第一个相同,因为您没有使用var重新初始化它。 - user201788
2个回答

7
你只有一个作用域,因此只能有一个同名变量。你是正确的,var允许通过逗号分隔声明多个变量,但你不能在同一作用域内声明两个不同的同名变量。你只是重新声明了一个已经存在的变量。
要么将其更改为classCt,要么像我一样使用变量j(以此类推)作为嵌套循环迭代器:
var i, j, k, l;
for(i = 0; i < 10; i++){
    for(j = 0; j < 10; j++){
        for(k = 0; k < 10; k++){
            for(l = 0; l < 10; l++){
            }
        }
    }
}

你是正确的。在for循环中声明的变量在循环终止后可见,因此其作用域不仅限于for循环本身。 - cc young
3
没问题,Javascript与一些其他语言(如使用块作用域的C)不同,它使用函数作用域(每个函数都有自己的作用域,同时还有一个全局作用域)。这里提供了一个链接以供阅读更多信息:http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/ - Paul
@Niko - 你觉得可以用 { } 块创建新作用域,这是不是错了? - cc young
@ccyoung 不,那不是真的。正如Paul所解释的那样,在javascript中只有函数才会创建新的作用域。这一点很重要,因为在许多其他语言(如Java或C)中是不同的。请参见此fiddle进行演示:http://jsfiddle.net/5Dn7w/ - Niko
1
@Niko 从技术上讲,with 在某些情况下也可以使用...但这并不被推荐 :) - user166390

1

你只在一个作用域内工作,即使使用var关键字,循环也不会创建自己的作用域。你只是在当前的函数作用域内重写了i变量,例如:

for (var i = 0; i < 10; i++) {
        for (var i = 5; i < 10; i++) {
            console.log(i);
        }
}

将只打印5、6、7、8、9。

如果您想创建一个新的作用域,您必须使用函数来完成,这通常是在JavaScript中完成的:

for (var i = 0; i < 10; i++) {
    (function(i) {
        for (var i = 5; i < 10; i++) {
            console.log(i);
        }
    })(i)
}

这将会在各自的行上打印出5、6、7、8、9,重复10次。


1
但是使用 'var' 会限制作用域为函数作用域,如果需要在 for 循环内声明 2 个变量该怎么办呢? :p - Orwellophile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接