是否有必要在CFScript中使用var scope循环变量?

时间:2011-01-06 04:00:39

标签: coldfusion coldfusion-9

当使用CFML和CF9时,我通常会调整我的循环变量范围;在这种情况下local.i,例如:

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

我最近开始将一些东西转换为CFScript,并且(令我失望的是我发现没有办法在CFScript中循环遍历列表)我想知道我是否仍然应该调整我的循环变量范围,以及如何:

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版本的循环中不存在。

2 个答案:

答案 0 :(得分:6)

如果您没有指定变量作用域,则默认情况下所有函数仍然使用变量作用域,这样可以省略它不是线程安全的。无论您以前应该使用var,都应该使用local

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

  1. 如果您不知道,list函数的分隔符参数不适用于多字符分隔符,它适用于多个分隔符;因此,您的列表将在每次出现逗号时被拆分,以及每次出现一个空格。

  2. 您使用相同的参数作为listLenlistGetAt方法的一部分,如下所示:

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

答案 1 :(得分:5)

你肯定需要像Adam所说的那样使用本地范围,但是在循环的情况下我认为使用“var”关键字而不是“本地”前缀是为了便于阅读。使用CF9,您不再需要在函数顶部放置var声明,因此您只需将“var”添加到“for”条件语句中,以使所有索引“i”变量成为线程安全的。< / p>

考虑到Ben在开始循环之前保存列表长度的好处,并使用更简洁的i ++增量样式代码:

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