function helloTranslator(String helloWord)
{
return function(String name)
{
return "#helloWord#, #name#";
};
}
ここhelloWord
でname
はスコープ指定できません。Owner
これらの変数が存在する宣言(親)関数のローカルスコープである「関数内で定義されたクロージャ」を含む暗黙のスコープがあります。したがって、クロージャからアクセスするには、これらの変数が (関数内で) 一意である必要があります。
最後に、スコープ外の変数の検索は次のように行われます。
- クロージャのローカル スコープ
- クロージャーの引数のスコープ
- 利用可能な場合、外部/所有者関数のローカル スコープ
- 利用可能な場合、外部/所有者関数の引数のスコープ
- 変数のスコープ (クロージャの作成時に利用可能)
- 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));