Moh*_*mad 7 coldfusion coldfusion-9
当使用CFML和CF9时,我通常会调整我的循环变量范围; 在这种情况下local.i
,例如:
<cfloop list="#this.list#" index="local.i">
<cfif Len(local.i) GT 10>
// do something
</cfif>
</cfloop>
Run Code Online (Sandbox Code Playgroud)
我最近开始将一些东西转换为CFScript,并且(令我失望的是我发现没有办法在CFScript中循环遍历列表)我想知道我是否仍然应该调整我的循环变量范围,以及如何:
for (i = 1; LTE ListLen(this.list); i = i + 1 ) {
if (Len(ListGetAt(this.list, i) GT 10)) {
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
我应该做什么,local.i = 1
而local.i = local.i + 1
不是我的例子中的示例代码?有必要吗?
编辑:我还应该问我的CFML循环的CFScript形式是否正确; 我问,因为我刚注意到我的CFML循环使用,
(逗号和空格)delimiter
参数,这似乎在CFScript版本的循环中不存在.
如果您没有指定一个函数,则默认情况下所有函数仍然使用变量作用域,这将使其省略不是线程安全的.无论您以前应该使用过哪里,都var
应该使用local
.
至于逗号+空格分隔符,有两件事:
如果你不知道,list函数的delimiters参数不适用于多字符分隔符,它适用于多个分隔符; 因此,您的列表将在每次出现逗号时被拆分,以及每次出现一个空格.
您使用相同的参数作为您listLen
和listGetAt
方法的一部分,如下所示:
for (i = 1; LTE ListLen(this.list, ', '); i = i + 1 ) {
if (Len(ListGetAt(this.list, i, ', ') GT 10)) {
// do something
}
}
Run Code Online (Sandbox Code Playgroud)你肯定需要像Adam所说的那样使用局部作用域,但是在循环的情况下,我认为使用"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
}
}
Run Code Online (Sandbox Code Playgroud)