1

私はCFスコープについて読んでいて、CFCスコープとその意味(詳細はこちら)に満足していますが、CFスコープを検索するときはいつでも、ほとんどの場合CFCのコンテキストで参照しています-したがって、明確化を望んでいましたCFM ページの範囲の周り。私は CF 9/10 で作業しているので、これらのリリースでスコープがどのように動作するかにのみ関心があります。

  1. CFM ページで使用できるスコープは何ですか? CFM ページには、他の場所で発生する可能性があるのと同じ同時実行の問題がありますか? または、CFM ページでスコープが設定された変数は、その特定の要求のスコープにバインドされていますか?

  2. この行<cfset myVar = 10 />を CFM ページに含めると、どの範囲に含まれますか? 同じページの他のユーザーが変数にアクセスしたり、他の cfm ページが変数にアクセスしたりするリスクはありますか?

ありがとう

4

2 に答える 2

2

「THIS」を除くほとんどすべてのスコープが CFM ページで利用可能です。

CFM ページで宣言されたスコープ外の変数は、直接呼び出すことも、VARIABLES スコープ プレフィックスを付けて呼び出すこともできます。

例えば:

<cfset varA = 'someValue'/>

のように書くこともできます

<cfset VARIABLES.varA = 'something' />

私の知る限り、シングルトン (CFC でのみ可能) を作成してアプリケーション スコープに配置しない限り、他のユーザーと変数を共有するリスクはありません。これは、CFC 関数でローカル変数を適切にスコープすることに注意を払っていない場合にも当てはまります。

CFM ページでは、各ユーザー リクエストに独自の処理スレッドがあり、他のユーザー リクエストと交差することはありません。したがって、変数はその特定のリクエストのスコープにのみバインドされます。

ページを要求するすべてのユーザーが変数を使用するようにする場合は、それを APPLICATION スコープに入れることができます。

2番目の質問がよくわかりませんでした。詳しく説明していただければ、回答にさらに追加できるかもしれません。

アップデート

このコードは、2 つの質問に答えるのに役立ちます。

<cfscript>
    function a(){
        _a = 20;
        WriteOutput("Inside function:"&variables['_a']);
        WriteOutput("Inside function:"&variables['_b']);
    }
    _b = 30;
    a();
    WriteOutput('outside function:'&variables['_a']);
</cfscript>

出力

内部機能:20
内部機能:30
外部機能:20

于 2013-03-28T11:12:49.167 に答える
1

このページは、利用可能なスコープの適切な説明を提供します。

よく調べてみると、変数のスコープを設定しない場合に何が起こるかについて、より多くの情報が見つかります。その要点は、コードは正常に実行されますが、効率が低下することです。これは、ColdFusion が正しいスコープを見つけようとするためです。指定された順序で特定のスコープをチェックします。その注文はどこかにありますが、すぐに見つけることができませんでした。

2 番目の質問については、

<cfset myVar = 10>

myVar 変数を変数スコープに入れます。

他のユーザーに影響を与える変数を変更する 1 人のユーザーに関して、危険にさらされている唯一のスコープはアプリケーション スコープであると考えています。ただし、最新のブラウザーでは、1 人のユーザーが自分のセッション変数を台無しにする可能性があります。私はそれが行われたのを見てきました。

変数が誤って変更される別の方法は、関数を使用することです。変数を関数に対してローカルに保ちたい場合は、変数をインスタンス化するときに var キーワードを使用する必要があります。CF のそれ以降のバージョンでは、同じことを実現するローカル スコープがあります。

個人的には、変数スコープを除くすべての変数にスコープを設定しています。

于 2013-03-28T12:22:16.323 に答える