3

ColdFusion 2016 の新しい設定によるsearchImplicitScopes="false"パフォーマンスの向上を利用するには、何が必要ですか:

...暗黙的なスコープで変数を検索することをバイパスするため、アプリケーションで定義された変数をより速く見つけることができます。

ColdFusion 2016 でCFC 内のスコープVariablesとスコープを開始する必要がありますか?ThissearchImplicitScopes="false"

CF2016 で暗黙的なスコープと見なされるものに関するドキュメントが見つかりません。私はかなり確信してlocalおり、argumentsスコープは関数内で問題ありませんが、CFC のような頻繁に使用されるスコープはvariablesどうthisですか?

4

2 に答える 2

3

すべてのものをスコープ!!!

CFC 内のvariablesスコープは、CFC 内のすべての関数に対してグローバルです。

CFC 内のthisスコープは、CFC 内のすべての関数に対してグローバルであり、CFC の呼び出し元からも参照できます。

CFC 内の変数のスコープを指定しない場合、デフォルトでvariablesスコープになります。

<--- this_test.cfc --->
<cfcomponent>
    <cfset variables.foo = "This is my CFC global variable." />
    <cfset this.bar = "This variable is global to my CFC and can be referenced externally." />
    <cfset narf = "Global variable! Point!" />
    <cffunction name="getNarf" access="public">
        <cfreturn narf />
    </cffunction>
</cfcomponent>

テスト通話:

<cfset test = new this_test() />

<cfoutput> <li>#test.foo#</li> <li>#test.bar#</li> <li>#test.narf#</li> <li>#test.getNarf()#</li> </cfoutput>

  1. fooスコープ内variablesにある場合、エラーが発生します。Element FOO is undefined in TEST.
  2. barthisスコープ内にあるため、 の出力が得られますtest.bar
  3. narfスコープ内variablesにある場合、エラーが発生します。Element NARF is undefined in TEST.
  4. の値を取得する唯一の方法narfは、関数で値を返すことです。

アップデート

これsearchImplicitScopesにより、CF のスコープ検索機能がオフになる可能性があります。したがって、何かをスコープしない場合、スコープの階層を検索しません。質問は、スコープのない変数はvariablesデフォルトでスコープに入るのですか? CFC が登場して以来、それがデフォルトになっているので、私はそう思います。

その設定の使用に関係なく、私はまだスコープすべてと言います。彼らが暗黙のlocalスコープを作成した理由は次のとおりです。

  1. 開発者は、var関数のローカル変数のスコープに慣れていませんでした
  2. 開発者var local = structNew()var.
  3. 2 では、関数のローカル変数のコレクションを返す機能も提供されました。
  4. CF 9 の時点で、var a = 0が と同じになると、これらのプライベート変数を として「スコープ」して参照する限り、local.a = 0のすべてのインスタンスを削除できます。var local = structNew()local.a

結論

CF がすべての要求で変数のスコープを検索する必要がある場合、パフォーマンスのオーバーヘッドが発生するということです。を使用してルックアップをオフにするとsearchImplicitScopes=false、パフォーマンスが向上するはずです。ただし、それは実際にはアプリケーションと平均リクエスト負荷に依存する必要があります。

于 2016-03-04T19:39:00.800 に答える
1

CF 2016 Express をインストールしたところ、変数がスコープされていなくてもスコープが検索されsearchImplicitScopes="false"ていると結論付けることができます。VariablesThis

于 2016-03-04T23:44:15.743 に答える