9

CFML と CF9 を使用する場合、通常、ループ変数を var スコープにします。この場合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 = 1やるべきですか?local.i = local.i + 1それは必要ですか?

編集: CFML ループの CFScript 形式が正しいかどうかも確認する必要があります。,CFML ループが引数に (コンマとスペース) を使用していることに気付いたので、質問delimiterします。これは、ループの CFScript バージョンには存在しないようです。

4

2 に答える 2

8

変数スコープを指定しない場合でも、すべての関数はデフォルトで変数スコープを使用します。これを省略すると、スレッドセーフではなくなります。以前は を使用varする必要がありましたが、現在はを使用する必要がありますlocal

カンマ + スペース区切り文字については、次の 2 つがあります。

  1. ご存じないかもしれませんが、list 関数の delimiters 引数は複数文字の区切り文字用ではなく、複数の区切り文字用です。そのため、リストはコンマの出現ごとに分割され、スペースの出現ごとにも分割されます。

  2. listLen次のように、 andlistGetAtメソッドの一部として同じ引数を使用します。

    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

Adam が言うように、必ずローカル スコープを使用する必要がありますが、ループの場合、読みやすさのために「ローカル」プレフィックスではなく「var」キーワードを使用する強いケースがあると思います。CF9 では、関数の先頭に var 宣言を配置する必要がなくなりました。したがって、すべてのインデックス "i" 変数の "for" 条件ステートメントに "var" を追加するだけで、スレッド セーフになります。

ループを開始する前にリストの長さを保存し、より簡潔な i++ インクリメント スタイルを使用することについての Ben の良い点を取り入れると、コードは次のようになります。

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 に答える