function helloTranslator(String helloWord)
{
return function(String name)
{
return "#helloWord#, #name#";
};
}
Aquí helloWord
y name
no puede estar al alcance. Existe un alcance implícito Owner
con "cierres definidos dentro de una función" que es el alcance local de la función de declaración (principal), donde están presentes estas variables. Entonces estas variables deben ser únicas (dentro de la función) para acceder desde los cierres.
En el cierre, la búsqueda de una variable sin ámbito pasa por: ámbito local
- de Cierre
- los argumentos de cierre alcance
ámbito local
- del exterior/Propietario función de si está disponible
alcance argumento de
- exterior/Propietario función si está disponible
- Alcance de variables (disponible en el momento de la creación del cierre)
- ColdFu sion alcance incorporado
Si algo tiene un alcance de Local
, en un cierre, buscaría en 1 solo. AFN no hay forma de hacer un alcance directo para 3,4.
p.s. como se dijo anteriormente, el alcance Owner
no es más que un ámbito implícito que apunta a una copia en caché del ámbito local de la función principal/externa en el momento de la creación del cierre.
p.s. Puede log an enhancement with ColdFusion para hacer que este alcance sea explícito.
Un ejemplo de diferentes ámbitos es el siguiente. Ejecute esto y comprenderá cómo el cierre usaría diferentes ámbitos.
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));
¿Puede usted proporcionar por favor un ejemplo de código más completo, entonces etiqueta que var pertenecen a los que alcance? y con qué var está disponible en el momento de la creación del cierre? ¿Tal vez una publicación de blog sobre este tema? Se está volviendo confuso. Gracias. – Henry
ER archivado: https://bugbase.adobe.com/index.cfm?event=bug&id=3191742 – Henry
El ejemplo de @Henry no encajará en el comentario así que estoy poniendo una respuesta separada para eso –