JavascriptProva

sabato 21 gennaio 2012

Il guaio di setInterval come metodo di window

Ora vediamo cosa c'è che non va in questa sintassi:
<script type="text/javascript">
funz =function(){
 alert(this);
 setInterval("this.funzione()",1000);
}
var oggetto={
 funzione: function(){
  alert("hu");
 },
 
 chiama: function(){
  funz.call(this);
 }
};
oggetto.chiama();


</script>
<body></body>
La funzione si svolge nel contesto dell'oggetto, in quanto il this è [object Object]
In IE ottengo il messaggio di errore: proprietà o metodo non supportato dall'oggetto. Probabilmente si riferisce al metodo setInterval che non è presente nell'oggetto.

Ora non uso il this
<script type="text/javascript">
funz =function(){
 alert(this);
 setInterval("this.funzione()",1000);
}
var oggetto={
 funzione: function(){
  alert("hu");
 },
 
 chiama: function(){
  funz.call();
 }
};
oggetto.chiama();


</script>
<body></body>
L'output è [object Window]. Questo significa che la funzione si svolge nel contesto di window.
Il messaggio di errore è sempre proprietà o metodo non supportato dall'oggetto, che probabilmente si riferisce al metodo this.funzione().
Il problema con setInterval è che dato che questo è un metodo di window viene svolto nello scope di window, e non può vedere i metodi dell'oggetto dall'interno, ma solo dall'esterno.
<script type="text/javascript">
funz =function(){
 alert(this);
 setInterval("oggetto.funzione()",1000);
}
var oggetto={
 funzione: function(){
  alert("hu");
 },
 
 chiama: function(){
  funz.call();
 }
};
oggetto.chiama();


</script>
<body></body>
Così funziona benissimo, perchè la funzione si svolge nello scope di window e vede dall'esterno i metodi dell'oggetto non indirizzati con this ma con il nome dell'oggetto.
Ma quando si abbia a che fare con un costruttore, nel quale bisogna usare necessariamente il this, allora vengono fuori i problemi.

Nessun commento:

Posta un commento