function helloTranslator(String helloWord)
{
return function(String name)
{
return "#helloWord#, #name#";
};
}
Tutaj helloWord
i name
nie może być zawężona. Istnieje niejawny zakres Owner
z "zamknięciami zdefiniowanymi w ramach funkcji", która jest lokalnym zasięgiem funkcji deklarowania (rodzica), gdzie te zmienne są obecne. Zatem te zmienne muszą być unikalne (w ramach funkcji), do których można uzyskać dostęp z zamknięć.
W zamknięcia, szukaj zmiennej unscoped przechodzi: zakres lokalny
- zamknięcia za
- argumenty zamknięcia jest zakres
zakres lokalny
- zewnętrzna/właściciel funkcyjnego jeśli dostępne
zakres argumentem
- zewnętrzna/właściciel funkcyjnego jeśli jest dostępny:
- Zakres zmiennych (dostępny w momencie tworzenia zamknięcia)
- ColdFu syjan wbudowany zakres
Jeśli coś jest z zakresu, jak Local
, w zamknięciu będzie wyszukiwać tylko w 1. AFN nie ma możliwości bezpośredniego zasięgnięcia 3,4.
p.s. jak wspomniano wcześniej, zasięg nie jest niczym innym niż ukrytym zakresem, który wskazuje na buforowaną kopię lokalnego zakresu funkcji zewnętrznej/macierzystej w momencie tworzenia zamknięcia.
p.s. Możesz log an enhancement with ColdFusion zrobić ten zakres wyraźnie.
Przykład różnych zakresów jest następujący. Uruchom to, a zrozumiesz, jak zamknięcie będzie używać różnych zakresów.
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));
Czy możesz zapewnić pełniejszy przykład kodu, który następnie label var należeć do którego zakres? i z jakim var jest dostępny w momencie tworzenia zamknięcia? Może blogu na ten temat? To staje się mylące. Dziękuję Ci. – Henry
Złożone na stronie: https://bugbase.adobe.com/index.cfm?event=bug&id=3191742 – Henry
@Na przykładowym wpisie nie pasuje komentarz, więc osobiście na to odpowiadam –