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

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 = 1local.i = local.i + 1不是我的例子中的示例代码?有必要吗?

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

Ada*_*tle 6

如果您没有指定一个函数,则默认情况下所有函数仍然使用变量作用域,这将使其省略不是线程安全的.无论您以前应该使用过哪里,都var应该使用local.

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

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

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

    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)

  • 无范围变量默认为变量范围,因此您需要确保使用新的"本地"范围或使用"var"关键字来限定所有局部变量. (2认同)

CfS*_*ity 5

你肯定需要像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)