2012-06-25 12 views
9

Una funzione in javascript forma una chiusura mantenendo un collegamento (nascosto) al suo ambito di chiusura.È possibile accedere alla chiusura di una funzione?

È possibile accedervi programmaticamente quando abbiamo la funzione (come valore variabile)?

Il vero obiettivo è teorico ma una dimostrazione potrebbe essere quella di elencare le proprietà della chiusura.

+0

Esempio di codice per spiegare meglio il tuo problema esatto – Blaster

+0

Il problema è teorico, non pratico: data una funzione, puoi elencare le proprietà della sua chiusura? –

+0

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

risposta

4

Questo è uno degli scopi di una chiusura: mantenere le informazioni private. Poiché la funzione è già stata eseguita, le sue variabili di ambito non sono più disponibili dall'esterno (e non sono mai state) - solo le funzioni eseguite nel suo ambito (ancora) hanno accesso.

Tuttavia è possibile fornire l'accesso tramite getter/setter.

Si potrebbe voler dare un'occhiata a Stuart Langridge's talk sulle chiusure. Molto raccomandabili sono anche le spiegazioni di Douglas Crockford. Si può fare un sacco di cose di fantasia con le chiusure;)

Edit: Sono disponibili diverse opzioni per esaminare la chiusura: Guarda l'oggetto nella console webdeveloper o (come lo faccio spesso) restituire un debug-funzione che discariche fuori tutte le variabili private alla console.

3

No, a meno che non si espone:

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

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


    x.setY(4); 
2

È possibile modificare la funzione di allarme:

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 

Oppure, se si possiede il codice, è possibile utilizzare getter e setter standart.

+6

Heh, + 1 per pensare fuori dagli schemi. Penso che l'OP voglia essere in grado di ispezionare tutte le variabili nella chiusura però. – Matt

+0

Voglio solo precisare che le chiusure non sono interamente nere. – jasssonpet

Problemi correlati