9

使用 CFML 和 CF9 时,我通常 var scope 我的循环变量;在这种情况下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 版本中似乎不存在。

4

2 回答 2

8

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

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

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

  2. 您在listLenandlistGetAt方法中使用相同的参数,如下所示:

    for (i = 1; LTE ListLen(this.list, ', '); i = i + 1 ) {
      if (Len(ListGetAt(this.list, i, ', ') GT 10)) {
        // do something
      }
    }
    
于 2011-01-06T04:49:20.243 回答
6

正如亚当所说,您肯定需要使用本地范围,但在循环的情况下,我认为为了可读性,使用“var”关键字而不是“本地”前缀是一个强有力的案例。使用 CF9,您不再需要将 var 声明放在函数顶部,因此您只需将“var”添加到“for”条件语句中,以使所有索引“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
    }
}
于 2011-12-17T10:31:16.403 回答