JavascriptProva

domenica 19 febbraio 2012

Ancora sugli scope...

Ecco...
Bisognerebbe distinguere l'ambiente dal quale si chiama una funzione...

Vediamo se mi sto costruendo un punto di vista giusto...

<script>

function funzione(){
 this.azione=function(){alert("prima");} 
}

function funzione2(){
 this.azione=function(){alert("seconda");} 
}

function funzione3(){
 this.azione=function(){alert("terza");} 
}

funzione();
funzione2();
funzione3();

azione();
</script>
Ottengo "terza".

I metodi azione di ciascuna funzione sono pubblici, ossia richiamabili dall'ambiente window in cui mi trovo.
Avendo lo stesso nome, viene chiamata l'ultima ad essere stata "materializzata" dalla chiamata delle funzioni.
Se io inverto la chiamata delle funzioni:
funzione();
funzione3();
funzione2();
ottengo "seconda" invece di "terza".

Invece ora "materializzo" un ambiente diverso.
Creo un oggetto di ciascuna funzione.
Il metodo azione può così essere riferito a ognuno dei diversi ambienti.
<script>

function funzione(){
 this.azione=function(){alert("prima");} 
}

function funzione2(){
 this.azione=function(){alert("seconda");} 
}

function funzione3(){
 this.azione=function(){alert("terza");} 
}

f=new funzione();
f2=new funzione2();
f3=new funzione3();
f.azione();
f2.azione();
f3.azione();

</script>
E ottengo nell'ordine "prima", "seconda" e "terza".

Ho chiamato il metodo da un ambito ristretto, ossia dall'interno di ciascun oggetto.

Ora metto insieme la chiamata delle funzioni (da ambiente window) e la creazione di nuovi ambienti (oggetti) da ogni funzione.
<script>
funzione();
funzione3();
funzione2();
function funzione(){
 this.azione=function(){alert("prima");} 
}

function funzione2(){
 this.azione=function(){alert("seconda");} 
}

function funzione3(){
 this.azione=function(){alert("terza");} 
}

f=new funzione();
f2=new funzione2();
f3=new funzione3();
f.azione();
f2.azione();
f3.azione();
azione();
</script>
così facendo, dapprima materializzo le tre funzioni, facendo in modo che il metodo azione venga impostato sulla funzione che mette a video "seconda"; quindi creo i tre oggetti.
Chiamo quindi i tre metodi dall'ambiente di ognuno dei tre oggetti, quindi chiamo il metodo della funzione materializzata nel contesto dell'ambiente window.
Dopo aver ordinatamente agito secondo il metodo azione di ogni oggetto, viene eseguito il metodo azione dell'ultima funzione materializzata nell'ambiente window...

Non so spiegarla compiutamente a parole e forse ho una nomenclatura impropria, ma l'ho capita.

Nessun commento:

Posta un commento