Coldfusion 是否有必要在CFScript中对作用域循环变量进行var?

Coldfusion 是否有必要在CFScript中对作用域循环变量进行var?,coldfusion,coldfusion-9,Coldfusion,Coldfusion 9,当使用CFML和CF9时,我通常使用var来定义我的循环变量;在这种情况下,local.i,例如: <cfloop list="#this.list#" index="local.i"> <cfif Len(local.i) GT 10> // do something </cfif> </cfloop> 我是否应该执行示例中示例代码的local.I=1和local.I=local.I+1istead?有必要吗 编辑:我还应该询问

当使用CFML和CF9时,我通常使用var来定义我的循环变量;在这种情况下,
local.i
,例如:

<cfloop list="#this.list#" index="local.i">
  <cfif Len(local.i) GT 10>
    // do something
  </cfif>
</cfloop>
我是否应该执行示例中示例代码的
local.I=1
local.I=local.I+1
istead?有必要吗


编辑:我还应该询问我的CFML循环的CFScript形式是否正确;我问这个问题是因为我刚刚注意到我的CFML循环使用了一个
(逗号和空格)作为
分隔符
参数,这在循环的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
      }
    }
    

  • 正如Adam所说,您肯定需要使用局部范围,但是在循环的情况下,为了可读性,我认为使用“var”关键字而不是“local”前缀是很有必要的。使用CF9,您不再被迫将var声明放在函数的顶部,因此您所需要做的就是将“var”添加到所有索引“i”变量的“for”条件语句中,使其成为线程安全的

    考虑到Ben关于在开始循环之前保存列表长度的优点,并使用更简洁的i++增量样式,您的代码将是:

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

    谢谢需要明确的是,当您说“UDF仍然使用变量范围”时,该定义是否包括我在CFC组件中声明的任何函数?不,CFC中的任何方法都将默认为本地范围。我提到的UDF将是其他任何地方(如自定义标记、cfm模板等)的非作用域变量默认为变量范围,因此您需要确保使用新的“局部”范围或“var”关键字对所有局部变量进行作用域。实际上,Tony,您完全正确。如果没有指定范围,我对默认值感到困惑。我会相应地更新我的答案。谢谢有了CF9和更高版本,您可以使用而不是GT,i++而不是i=i+1,我要注意一件事——除非您的“do something”可以更改列表的长度,否则我会将它存储在一个变量中并循环到该变量。我的理解是,按照您编写本文的方式,每个循环都将调用listlen()操作。
    var listLength  =   ListLen( this.list );
    for (var i = 1; LTE listLength; i++ ) {
        if (Len(ListGetAt(this.list, i) GT 10)) {
        // do something
        }
    }