JavascriptProva

venerdì 20 gennaio 2012

Lo scope delle "funzioni-prostituta"

Ora vediamo come si comportano le "funzioni-prostituta", quelle che vengono chiamate con call. Vediamo se una di queste funzioni esterne si comporta come una funzione interna per quanto riguarda lo scope.
Facciamo accedere una funzione esterna a una variabile pubblica dell'oggetto.
<script>

function oggetto(nome, cognome){
 this.nome=nome;
 this.cognome=cognome;  
}

function scrivi(){
 alert(this.nome+" "+this.cognome);
}

function azione(){
 Mario=new oggetto("Mario", "Rossi");
 scrivi.call(Mario);
}
</script>
<body onLoad="azione();">
</body>
Output: "Mario Rossi".
Conclusione: una funzione esterna usata con il call può leggere le variabili pubbliche di un oggetto.
Proviamo con le variabili private:
<script>

function oggetto(nome, cognome){
 var nome=nome;
 var cognome=cognome;  
}

function scrivi(){
 alert(this.nome+" "+this.cognome);
}

function azione(){
 Mario=new oggetto("Mario", "Rossi");
 scrivi.call(Mario);
}
</script>
<body onLoad="azione();">
</body>
Output: "undefined undefined".

Se poi elimino il this dalla funzione esterna...
<script>

function oggetto(nome, cognome){
 var nome=nome;
 var cognome=cognome;  
}

function scrivi(){
 alert(nome+" "+cognome);
}

function azione(){
 Mario=new oggetto("Mario", "Rossi");
 scrivi.call(Mario);
}
</script>
<body onLoad="azione();">
</body>
ottengo una pagina completamente bianca e un errore: nome non è definito.
Conclusione: una funzione chiamata con il call non può leggere le variabili private. Dunque ha uno scope pubblico.
Questo è meno lapalissiano...

Nessun commento:

Posta un commento