使用 CFML 和 CF9 时,我通常将循环变量设置为 var 范围;在这种情况下 local.i, , 例如:

<cfloop list="#this.list#" index="local.i">
  <cfif Len(local.i) GT 10>
    // do something
  </cfif>
</cfloop>

我最近开始将一些东西转换为 CFScript,并且(令我失望的是,我发现无法在 CFScript 中循环列表)我想知道我是否仍然应该 var 作用域我的循环变量,以及如何:

for (i = 1; LTE ListLen(this.list); i = i + 1 ) {
  if (Len(ListGetAt(this.list, i) GT 10)) {
    // do something
  }
}

我应该做什么 local.i = 1local.i = local.i + 1 而不是我的示例中的示例代码?有必要吗?

编辑:我还应该询问我的 CFML 循环的 CFScript 形式是否正确;我问这个问题是因为我刚刚注意到我的 CFML 循环使用了 , (逗号和空格)为 delimiter 参数,这在循环的 CFScript 版本中似乎不存在。

有帮助吗?

解决方案

如果您不指定变量范围,所有函数默认情况下仍然使用变量范围,这将导致省略它成为非线程安全的。无论您以前应该在哪里使用 var 你现在应该使用 local.

至于逗号+空格分隔符,有两件事:

  1. 如果您不知道,列表函数的 delimiters 参数不是用于多字符分隔符,而是用于多个分隔符;因此,您的列表将针对每次出现的逗号以及每次出现的空格进行拆分。

  2. 您使用相同的论点作为您的一部分 listLenlistGetAt 方法,像这样:

    for (i = 1; LTE ListLen(this.list, ', '); i = i + 1 ) {
      if (Len(ListGetAt(this.list, i, ', ') GT 10)) {
        // do something
      }
    }
    

其他提示

您肯定需要为亚当说,使用当地的范围,但在循环的情况下,我认为有使用“无功”的关键字,而不是可读性的原因“本地”前缀的强有力的理由。随着CF9你不再被迫地方VAR的声明在函数的顶部,因此,所有你需要做的就是添加“VAR”你“为”条件语句对所有的索引“i”的变量成为线程安全的。

回吐Ben的好点关于保存列表的长度之前开始循环,并使用更简洁的i ++在增量式的代码是:

var listLength  =   ListLen( this.list );
for (var i = 1; LTE listLength; i++ ) {
    if (Len(ListGetAt(this.list, i) GT 10)) {
    // do something
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top