【问题标题】:in javascript, declare more than one variable in for loop在 javascript 中,在 for 循环中声明多个变量
【发布时间】:2012-03-18 01:52:02
【问题描述】:

有以下 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 时,代码按预期工作

【问题讨论】:

  • “在第二个循环中将 i 更改为 classCt 时,代码按预期工作” - 那你为什么不这样做呢?
  • i 更改为classCt 在哪里?第二个 for 循环中的 i 确实与第一个相同,因为您没有使用 var 再次对其进行初始化。

标签: javascript variables for-loop scope


【解决方案1】:

你只有一个作用域,所以只能有一个同名的变量。您是正确的, 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 循环本身。
  • @ccyoung 没错,Javascript 与其他一些使用块作用域的语言(例如 C)不同。它使用函数作用域(每个函数都有自己的作用域,并且有一个全局作用域)。这是阅读更多内容的链接:robertnyman.com/2008/10/09/…
  • @Niko - 认为可以使用 { } 块创建新范围 - 这不是真的吗?
  • @ccyoung 不,这不是真的。正如 Paul 解释的那样,只有函数才能在 javascript 中创建新的作用域。了解这一点很重要,因为这在许多其他语言(如 Java 或 C)中是不同的。请参阅此小提琴进行演示:jsfiddle.net/5Dn7w
  • @Niko 从技术上讲,with 在某些情况下也足够了......但不建议这样做:)
【解决方案2】:

您只在一个范围内工作,即使您使用 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 次。

【讨论】:

  • 但是使用 'var' 是否限制了函数的范围,如果是,如何在 for 循环中声明 2 个变量? :p
猜你喜欢
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
  • 2011-03-21
相关资源
最近更新 更多