3

私は、いくつかの Ajax リクエスト用に開かれた多数のリモート CFC があり、CFC のほとんどのメソッド内に次のものがあるプロジェクトを継承しました。

<cfset var this.response = true />

varこのようにスコープとが一緒に使用されているのを見たことthisがないので、どうすればよいか本当にわかりません。私の質問は次のとおりです。

これがどのようにコーディングされたかに問題はありますか?もしそうなら、それらはすべての CFC を のようなものに更新する努力をするほど十分に重要 <cfset var req.response = true />ですか?

これが私が見ているものの簡単な例です:

<cfcomponent>

    <cffunction name="check_foo" access="remote" returnformat="plain">

        <cfargument
          name     = "isfoo"
          type     = "string"
          required = "false"
          default  = "nope"
          hint     = "I check the string for foo"
          />

        <cfscript>

          /*setup new response*/
          var this.response = false;

          /*check for foo*/
          if( !findnocase( "foo", arguments.isfoo ) ) {

            /*no foo!*/
            this.response = false;

          }

          return this.response;

        </cfscript>

    </cffunction>

</cfcomponent>

.


アップデート:

  1. 以下のフィードバック/回答に基づいて、のすべてのインスタンスを置き換えましたvar this。助けてくれたみんなにもう一度感謝します!

.


4

2 に答える 2

4

更新: ダンプを確認すると、"this"var thisはまだこのthisスコープであり、local.this ではありません。

スコープへの応答を設定していthisます。この場合、CFC はリモートで呼び出されるたびにインスタンス化されるため、機能します。ただし、thisメソッドが他の CFC によってパブリック メソッドとして呼び出された場合に備えて、スレッド セーフを確保するために別の名前に変更することをお勧めします。

于 2012-07-09T21:54:22.087 に答える
3

を使用var thisするのと同じthisです。

スコープをダンプすると、ローカル変数とlocalスコープが含まれます。(これは文書化されていませんが、私はこの結果を裸の CFC で取得しています。あなたのスクリーンショットでそれを取得しています。)ArgumentsThis

あなたの関数は であるため、access="remote"すべての呼び出しで cfc の新しいインスタンスを取得するため、裸のThisスコープになります。したがって、それらは「安全」ですが、それでも悪い考えです。

リモート以外の関数で を使用するvar thisと、望ましくない永続性が発生し、結果として無効なデータになる競合状態が発生する可能性があります。

関連する CF ドキュメント:

" Flash Remoting および Web サービスを介してリモートで実行されるメソッドは、メソッドを実行する前に、常に CFC の新しいインスタンスを作成します。 "

" This スコープの変数値は、CFC インスタンスが存在する限り存続するため、CFC インスタンスのメソッドへの呼び出し間で存続できます。 "

于 2012-07-10T09:23:55.607 に答える