11

Adobe ColdFusion 10: Using Closures ドキュメントから引用:

function helloTranslator(String helloWord) 
{ 
    return function(String name) 
    { 
        return "#helloWord#, #name#"; 
    }; 
}

リターンラインで適切にスコープhelloWordを設定する方法は? nameどちらもArguments対象ですか?その場合、それらは一意である必要がありますか?

Closures and functionsセクションでは、すでに長いスコープ検索に加えて、さらに 4 つのスコープがあることにも言及しています。

最後に、スコープなし変数の検索順序は次のとおりです。

  1. クロージャーのlocalスコープ
  2. クロージャーのargumentsスコープ
  3. 利用可能な場合、外部関数のlocalスコープ
  4. 所有者関数のlocalスコープ (利用可能な場合)
  5. ColdFusion 組み込みスコープ

何かを としてスコープする場合'local.'、1 のみを検索しますか、それとも 1,3 & 4 を検索しますか?

ところで、私はクロージャーとアウターを理解しています。所有者は誰ですか?

ありがとうございました


更新:提出された機能強化リクエスト: ColdFusion 10.0 - 機能 3191742

4

2 に答える 2

7
    function helloTranslator(String helloWord) 
    { 
      return function(String name) 
      { 
        return "#helloWord#, #name#"; 
      }; 
    }

ここhelloWordnameはスコープ指定できません。Ownerこれらの変数が存在する宣言(親)関数のローカルスコープである「関数内で定義されたクロージャ」を含む暗黙のスコープがあります。したがって、クロージャからアクセスするには、これらの変数が (関数内で) 一意である必要があります。

最後に、スコープ外の変数の検索は次のように行われます。

  1. クロージャのローカル スコープ
  2. クロージャーの引数のスコープ
  3. 利用可能な場合、外部/所有者関数のローカル スコープ
  4. 利用可能な場合、外部/所有者関数の引数のスコープ
  5. 変数のスコープ (クロージャの作成時に利用可能)
  6. ColdFusion 組み込みスコープ

何かが としてスコープされている場合Local、クロージャーでは、1 のみで検索されます。AFN 3,4 を直接スコープする方法はありません。

ps 前述のOwnerスコープは、クロージャーの作成時に親/外部関数のローカルスコープのキャッシュされたコピーを指す暗黙のスコープに他なりません。

psこのスコープを明示的にするために、ColdFusion の拡張をログに記録することができます。

さまざまなスコープの例を次に示します。これを実行すると、クロージャーがさまざまなスコープを使用する方法を理解できます。

any function exampleClosureForm(arg1){

    function x(innerArg1,innerArg2){
        //var arg1= 50;// will hide parent's arg1 if declared
        writedump(arguments);// would dump closure's
        writedump(local);// would dump closure's
        writedump(session.a); // would be same session shared across
        writedump(arg1); // would dump parents argument arg1
        return session.a-- + innerArg1+innerArg2+arg1--;// decrementing to see its behavior for successive call
    };  
    writeoutput(x(1,2));
    writedump(arguments,"browser","html",false,"function");// would dump parent's
    writedump(local,"browser","html",false,"function");// would dump parent's
    arg1 = -100; // since closure is sharing the parent's variable, this change should get reflected
    return x;
}
session.a = 10;
a = exampleClosureForm(10);
writeoutput("now the calls <br>"); 
writeoutput(a(innerArg1=5,innerArg2=5)); 
writeoutput("<br>");
// with argumentcollection
argsColl = structNew();
argsColl.innerArg1= 1;
argsColl.innerArg2= 3;
writeoutput(a(argumentCollection = argsColl));
于 2012-05-16T11:02:04.743 に答える
3

ええ、私が知る限り、親関数の引数のスコープを指定することはできないため、クロージャの引数には別の名前を付ける必要があります。あなたがする必要があるのは、別の名前で、親関数に中間変数を持つことです:

function helloTranslator(String s){
    var otherS = arguments.s;
    return function(String s){ 
        return "#otherS#, #s#"; 
    }; 
}

これは理想的とは言えません。単純に CF に一致を探し回らせるのではなく、親の引数スコープをスコープ指定された方法で参照できるようにする必要があります。

私があなただったら、Adobe にバグを報告します。

于 2012-05-16T07:55:44.980 に答える