2012-06-25 12 views
9

Una función en javascript forma un cierre al mantener un enlace (oculto) a su alcance adjunto.¿Es posible acceder al cierre de una función?

¿Es posible acceder a él mediante programación cuando tenemos la función (como valor variable)?

El objetivo real es teórico, pero una demostración podría ser enumerar las propiedades del cierre.

var x = (function(){ 
    var y = 5; 
    return function() { 
     alert(y); 
    }; 
})(); 

//access y here with x somehow 
+0

La muestra de código explicaría mejor su problema exacto – Blaster

+0

El problema es teórico, no práctico: dada una función, ¿puede enumerar las propiedades de su cierre? –

+0

'console.log (x(). Y); // 5'? – Blaster

Respuesta

4

Ese es uno de los fines del cierre: mantener la información en privado. Como la función ya se ha ejecutado, sus variables de ámbito ya no están disponibles desde el exterior (y nunca lo han estado); solo las funciones ejecutadas en su ámbito (todavía) tienen acceso.

Sin embargo, podría dar acceso a través de getters/setters.

Es posible que desee echar un vistazo a Stuart Langridge's talk sobre cierres. Muy recomendable también son las Explicaciones de Douglas Crockfords. Puedes hacer muchas cosas elegantes con cierres;)

Editar: Tienes varias opciones para examinar el cierre: Mira el objeto en la consola webdeveloper o (como lo hago a menudo) devuelve una función de depuración que se vacía todas las variables privadas a la consola.

3

No, a menos que se expone:

var x = function(){ 
     var y = 5; 

     return {    
      getY: function(){ 
       return y; 
      }, 
      setY: function(newY){ 
      y = newY; 
      }  
     } 
    } 


    x.setY(4); 
2

Puede editar la función de alerta:

var x = (function(){ 
    var y = 5; 
    return function() { 
     alert(y); 
    }; 
})(); 

var oldAlert = alert; 

alert = function (x) { 
    oldAlert(x); 
    window.y = x; 
} 

x(); 

console.log(y); // 5 

O si es el propietario del código, puede utilizar captadores y definidores del standart.

+6

Heh, + 1 para pensar fuera de la caja. Creo que el OP quiere poder inspeccionar todas las variables en el cierre sin embargo. – Matt

+0

Solo quiero aclarar que los cierres no son completamente negros. – jasssonpet

Cuestiones relacionadas