当使用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 = 1
和local.i = local.i + 1
而不是我示例中的示例代码吗?有必要吗?
编辑:我还应该问一下我的CFML循环的CFScript格式是否正确;我问,因为我刚注意到我的CFML循环使用,
(逗号和空格)作为delimiter
参数,这似乎在CFScript版本的循环中不存在。
答案 0 :(得分:6)
如果您没有指定变量作用域,则默认情况下所有函数仍然使用变量作用域,这样可以省略它不是线程安全的。无论您以前应该使用var
,都应该使用local
。
至于逗号+空格分隔符,有两件事:
如果您不知道,list函数的分隔符参数不适用于多字符分隔符,它适用于多个分隔符;因此,您的列表将在每次出现逗号时被拆分,以及每次出现一个空格。
您使用相同的参数作为listLen
和listGetAt
方法的一部分,如下所示:
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
}
}