すべてのものをスコープ!!!
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>
foo
スコープ内variables
にある場合、エラーが発生します。Element FOO is undefined in TEST.
bar
はthis
スコープ内にあるため、 の出力が得られますtest.bar
。
narf
スコープ内variables
にある場合、エラーが発生します。Element NARF is undefined in TEST.
- の値を取得する唯一の方法
narf
は、関数で値を返すことです。
アップデート
これsearchImplicitScopes
により、CF のスコープ検索機能がオフになる可能性があります。したがって、何かをスコープしない場合、スコープの階層を検索しません。質問は、スコープのない変数はvariables
デフォルトでスコープに入るのですか? CFC が登場して以来、それがデフォルトになっているので、私はそう思います。
その設定の使用に関係なく、私はまだスコープすべてと言います。彼らが暗黙のlocal
スコープを作成した理由は次のとおりです。
- 開発者は、
var
関数のローカル変数のスコープに慣れていませんでした
- 開発者
var local = structNew()
はvar
.
- 2 では、関数のローカル変数のコレクションを返す機能も提供されました。
- CF 9 の時点で、
var a = 0
が と同じになると、これらのプライベート変数を として「スコープ」して参照する限り、local.a = 0
のすべてのインスタンスを削除できます。var local = structNew()
local.a
結論
CF がすべての要求で変数のスコープを検索する必要がある場合、パフォーマンスのオーバーヘッドが発生するということです。を使用してルックアップをオフにするとsearchImplicitScopes=false
、パフォーマンスが向上するはずです。ただし、それは実際にはアプリケーションと平均リクエスト負荷に依存する必要があります。