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
- di chiusura
- argomentazioni di chiusura portata
ambito locale
- della funzione esterno/proprietario se disponibile
portata argomento della funzione
- esterno/Proprietario se disponibile
- Ambito delle variabili (disponibile al momento della creazione della chiusura)
- 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));
fonte
2012-05-16 11:02:04
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
ER archiviato: https://bugbase.adobe.com/index.cfm?event=bug&id=3191742 – Henry
@Henry esempio non si inserisce nel commento, quindi sto mettendo una risposta separata per quello –