2012-05-15 8 views
10

Cytat z Adobe ColdFusion 10: Using closures documentation:Jak zmieniać zmienne zamknięcia w CF10?

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

Jak zakresu helloWord i name poprawnie na linii powrotnej? Czy oba są w zasięgu Arguments? Jeśli tak, to muszą być unikatowe?

Sekcja Closures and functions wspomina również istnieją 4 więcej zakresów na górze już długich poszukiwaniach zakres:

W zamknięcia, następnym jest kolejność poszukiwaniu zmiennej unscoped:

  1. Zamknięcie na local zakres
  2. zamknięcia za arguments zakres
  3. Outer funkcyjnego local zakres jeśli availa ble
  4. właściciela funkcyjnego local zakres jeśli dostępne
  5. ColdFusion wbudowany w zakresie

Gdybym zakres coś jak 'local.', to szukaj tylko 1 lub 1,3 & 4?

BTW, rozumiem Zamknięcie & Zewnętrzne. Kto jest Właściciel?

Dziękuję


Aktualizacja: Enhancement Wniosek złożony: ColdFusion 10.0 - Feature 3191742

Odpowiedz

7
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

  1. zamknięcia za
  2. argumenty zamknięcia jest zakres
  3. zakres lokalny
  4. zewnętrzna/właściciel funkcyjnego jeśli dostępne
  5. zakres argumentem
  6. zewnętrzna/właściciel funkcyjnego jeśli jest dostępny:
  7. Zakres zmiennych (dostępny w momencie tworzenia zamknięcia)
  8. 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)); 
+0

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

+0

Złożone na stronie: https://bugbase.adobe.com/index.cfm?event=bug&id=3191742 – Henry

+1

@Na przykładowym wpisie nie pasuje komentarz, więc osobiście na to odpowiadam –

2

Tak, o ile mogę powiedzieć, nie można określić zakres argumentów funkcji nadrzędnej, więc argumenty swojego zamknięcia w muszą mieć różne nazwy. Co trzeba zrobić, to mieć zmienną pośredniczącą w funkcji nadrzędnej, pod inną nazwą:

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

To mniej niż ideał: jeden powinien aby móc odnieść się do argumentów zakresu rodzica w moda w scopedzie, nie tylko wymaga CF, aby polować na mecz.

Byłbym raise a bug with Adobe gdybym był tobą.

+0

ER złożony: https://bugbase.adobe.com/index.cfm?event=bug&id=3191742 – Henry