function helloTranslator(String helloWord)
{
return function(String name)
{
return "#helloWord#, #name#";
};
}
這裏helloWord
和name
不能作用域。有一個隱含的「閉包在一個函數內定義」,這是聲明(父)函數的局部範圍,其中存在這些變量。所以這些變量必須是唯一的(在函數內)才能從閉包中訪問。
在閉合,尋找無作用域變量經歷:
- Closure的局部範圍
- Closure的參數範圍
- 外/所有者函數的局部範圍(如果可用)
- 外/所有者函數的參數範圍如果可用
- 變量範圍(可在創建時關閉)
- ColdFu sion內置示波器
如果範圍爲Local
,則在閉包中,它將僅搜索1。 AFN沒有辦法直接爲3,4範圍。
p.s.因爲前面提到的Owner
範圍不過是一個隱式範圍,它指向創建閉包時父/外函數本地範圍的緩存副本。
p.s.你可以用log an enhancement with 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));
能否請您提供一個更完整的代碼示例,然後標籤,該標籤變種屬於哪個範圍?並且在創建閉包時可以使用什麼var?也許是關於這個話題的博客文章?它變得混亂。謝謝。 – Henry
ER提交:https://bugbase.adobe.com/index.cfm?event=bug&id=3191742 – Henry
@Henry示例不適合在評論中,所以我正在爲此提出一個單獨的答案 –