2012-05-15 10 views
10

Citato dal Adobe ColdFusion 10: Using closures documentation:Come modificare le variabili di chiusura dell'oscilloscopio in CF10?

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

Come ambito helloWord e name correttamente sulla linea di ritorno? Sono entrambi nello scope Arguments? Se è così, devono essere unici?

La sezione Closures and functions menziona inoltre ci sono altri 4 ambiti in cima alla già lunga ricerca portata:

In chiusura, seguendo l'ordine di ricerca per una variabile senza ambito:

  1. chiusura di local portata
  2. arguments portata di chiusura
  3. local portata della funzione Outer se dispo ble
  4. local portata
  5. della funzione proprietario se disponibile
  6. ColdFusion incorporato portata

Se ho portata qualcosa come 'local.', sarebbe ricerca 1 solo, o 1,3 & 4?

BTW, capisco Chiusura & Esterno. Chi è Proprietario?

Grazie


Aggiornamento: Enhancement richiesta presentata: ColdFusion 10.0 - Feature 3191742

risposta

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

Qui helloWord e name non possono essere scope. Esiste uno scope implicito Owner con "chiusure definite all'interno di una funzione", che è l'ambito locale della funzione dichiarante (genitore), dove sono presenti queste variabili. Quindi queste variabili devono essere uniche (all'interno della funzione) a cui accedere dalle chiusure.

In chiusura, la ricerca di una variabile senza ambito passa attraverso: ambito locale

  1. di chiusura
  2. argomentazioni di chiusura portata
  3. ambito locale
  4. della funzione esterno/proprietario se disponibile
  5. portata argomento della funzione
  6. esterno/Proprietario se disponibile
  7. Ambito delle variabili (disponibile al momento della creazione della chiusura)
  8. ColdFu scope integrata

Se qualcosa ha lo scope come Local, in una chiusura, cerca solo in 1. AFN non esiste un modo per raggiungere direttamente il 3,4.

p.s. come detto in precedenza lo scope Owner non è altro che un ambito implicito che punta a una copia memorizzata nella cache dell'ambito locale della funzione parent/outer al momento della creazione della chiusura.

p.s. È possibile log an enhancement with ColdFusion rendere esplicito questo ambito.

Un esempio di diversi ambiti è il seguente. Esegui questo e capirai come la chiusura userebbe diversi ambiti.

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

Si può fornire un esempio di codice più completo, poi un'etichetta che var appartengono a cui campo di applicazione? e con che var è disponibile al momento della creazione della chiusura? Forse un post sul blog su questo argomento? Sta diventando confuso. Grazie. – Henry

+0

ER archiviato: https://bugbase.adobe.com/index.cfm?event=bug&id=3191742 – Henry

+1

@Henry esempio non si inserisce nel commento, quindi sto mettendo una risposta separata per quello –

2

Sì, per quanto posso dire, non si può specificare un ambito per argomenti della funzione genitore, quindi gli argomenti del vostro chiusura bisogno di avere nomi diversi Quello che è necessario fare è di avere una variabile intermediario nella funzione genitore, con un nome diverso:

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

Questa è proprio l'ideale: una dovrebbe essere in grado di fare riferimento a portata argomenti della controllante in un modo scoped, non semplicemente richiede CF per cacciare in giro per una partita.

I'd raise a bug with Adobe se fossi in te.

+0

ER archiviato: https://bugbase.adobe.com/index.cfm?event=bug&id=3191742 – Henry

Problemi correlati