2010-02-27 26 views
6

Una función local en el cierre declara una variable con el mismo nombre que existe en el cierre. Entonces, ¿cómo podríamos acceder a la variable de cierre desde la función local?Distinguir cierre y variables locales

function closure() 
{ 
    var xVar; 
    function func1() 
    { 
     var xVar; 
     // how to distinguish local and closure scopes. 
     return xVar; 
    } 
    return function() { return func1(); }; 
} 

Crear un objeto privado y hacer variables privadas como propiedades de este objeto podría ayudar. Pero me pregunto si hay una solución mejor y ordenada. ¿Puede una cadena de alcance ayudar?

He editado para que sea un cierre completo. De todos modos, los cierres no son una gran preocupación aquí, podría considerarse para funciones internas, sin embargo, puede haber una solución con cierres de alguna manera.

Gracias

Respuesta

3

No se puede acceder a la cadena de alcance explícitamente en JS. Su problema es el antiguo sombreado variable, pero es mucho más enloquecedor porque en JS, la cadena de alcance es realmente allí en tiempo de ejecución, simplemente no está disponible para que usted pueda acceder.

Usted puede jugar algunos trucos con rejiggering alcance actual si se utiliza el operador de with odiaba, pero que (así como arguments 's persona que llama/destinatario de la llamada materia) en realidad sólo le dan acceso a objetos y funciones con sus propiedades. No hay forma de decir "dame lo que xVar significa en el ámbito de tiempo de ejecución n-1 desde aquí".

0

En su ejemplo la variable xVar no es un cierre, porque se redefinió su ámbito de aplicación para cada función. Para usar esa variable como cierre, continúe para declararlo con el comando var en la función closure() y luego no lo declare con la función var en la función func1(). En lugar de eso, simplemente use la variable inmediatamente en func1().

No hay una manera fácil de probar si una función es un cierre o una variable local. Tendría que realizar algún tipo de prueba de control de flujo y luego analizar las asignaciones, dónde se realizan las asignaciones y dónde no se realizan las asignaciones. Entonces debes comparar esos resultados. Podría escribir una herramienta, en JavaScript, para realizar ese análisis sobre una entrada determinada y escribirle un informe como salida.

+3

Creo que él sabe eso. La pregunta es, desde el código dentro de "func1" ¿cómo se referiría explícitamente al "xVar" definido en "cierre" (y no al "xVar" definido en "func1")? – Pointy

+0

Respondí eso en mi primer párrafo. –

1

Las variables definidas en un ámbito interno ocultan declaraciones de variables en un ámbito externo. La "mejor solución" no es reutilizar nombres de variables de esa manera.

Cuestiones relacionadas