2012-05-15 10 views
10

citado del Adobe ColdFusion 10: Using closures documentation:¿Cómo se clasifican las variables de cierre en CF10?

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

Cómo alcance helloWord y name correctamente en la línea de retorno? ¿Están ambos en el alcance Arguments? Si ese es el caso, ¿deben ser únicos?

La sección Closures and functions también menciona que hay 4 más alcances en la parte superior de la ya larga búsqueda alcance:

En el cierre, después es el orden de búsqueda de una variable sin ámbito:

  1. Cierre de local alcance
  2. arguments alcance de Cierre
  3. de función externa local alcance si availa ble
  4. local alcance de
  5. propietario función de si está disponible
  6. ColdFusion incorporado en su alcance

Si alcance algo tan 'local.', habría que buscar solamente 1 o 1,3 & 4?

BTW, entiendo Cierre & Exterior. ¿Quién es Propietario?

Gracias


Actualización: Mejora Solicitud presentada: ColdFusion 10.0 - Feature 3191742

Respuesta

7
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

  1. de Cierre
  2. los argumentos de cierre alcance
  3. ámbito local
  4. del exterior/Propietario función de si está disponible
  5. alcance argumento de
  6. exterior/Propietario función si está disponible
  7. Alcance de variables (disponible en el momento de la creación del cierre)
  8. 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)); 
+0

¿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

+0

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

+1

El ejemplo de @Henry no encajará en el comentario así que estoy poniendo una respuesta separada para eso –

2

Sí, por lo que yo puedo decir, no se puede especificar un ámbito de argumentos de la función de los padres, por lo que los argumentos de su cierre necesita tener diferentes nombres. Lo que tendrá que hacer es tener una variable intermediaria en la función madre, con un nombre diferente:

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

Esto es menos que ideal: un debe para poder referirse a alcance los argumentos de los padres en una forma de alcance, no solo requiere CF para buscar un partido.

I'd raise a bug with Adobe si yo era usted.

+0

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

Cuestiones relacionadas