Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683

    passare variabili col setTimeout

    ciao a tutti! sto provando a passare delle variabili a funzioni richiamate con il setTimeout
    se scrivo il contenuto della variabile va, come in questo caso
    codice:
    <script type="text/javascript">
    var count=0;
    alertMsg(count);
    function alertMsg(count)
    {
    	clearTimeout(t);
    	alert(count);
    	var t=setTimeout("alertMsg('ciao')",2000);
    }
    </script>
    se metto proprio una variabile no... come lo devo scrivere?
    codice:
    <script type="text/javascript">
    var count=0;
    alertMsg(count);
    function alertMsg(count)
    {
    	clearTimeout(t);
    	alert(count);
            var a="ciao";
    	var t=setTimeout("alertMsg(a)",2000);
    }
    </script>
    come risolvo?

  2. #2
    <script type="text/javascript">

    function alertMsg(count)
    {
    //clearTimeout(t);
    alert(count);
    }

    var a="ciao";
    var t=setTimeout(function(){alertMsg(a);},2000);
    </script>

  3. #3
    Per spiegare meglio quel che accade:

    la funzione viene incapsulata dentro una funzione anonima, il che ne preserva la visibilità della variabile.

    Nel codice che tu hai postato ci sono 3 elementi discutibili:

    1) chiami la funzione prima che la sua signature sia caricata in memoria - se ti funziona è perchè sei fortunato e il runtime non fa a tempo ad accorgersi di questa differenza, ma le funzioni si chiamano DOPO che sono state definite, non prima
    2) fai un clear del timeout ma esso non è necessario (setTimeout si esegue una volta sola, per cui non corri il rischio che si ripeta, se era questo che temevi): lo sarebbe per un setInterval
    3) metti il timeout dentro la funzione, ed esso richiama la funzione: sarebbe meglio invocare il timeout fuori della funzione, eprchè se prendi questa abitudine rischi prima o poi di ritrovarti davanti a brutte ricorsioni (in tal caso il clearTimeout ti metteva una pezza sopra un errore concettuale potenzialmente grave, e te lo faceva passare inosservato).

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683
    grazie mille! ma posso passare anche interi oggetti con setInterva e setTimeout?

  5. #5
    puoi passare funzioni e argomenti alle funzioni

  6. #6
    se con oggetti intendi metodi di funzioni, sì: sono funzioni

    codice:
    <script>
    
    function foo(){
    this.ciao=function(msg){alert(msg);}
    }
    var istanza=new foo();
    
    var x='saluti!';
    setInterval(function(){istanza.ciao(x)}, 3000)
    
    </script>
    ps setInterval si cancella non con clearTimeout ma con clearInterval - òa differenza è che setInterval continua ad eseguirsi all' intervallo dato in millisecondi, mentre setTimeout si esegue una volta sola (a meno che non cerchi di renderlo ricorsivo ma come ti dicevo è una prassi sconsigliabile, tanto più che hai setInterval per questo)

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683
    quindi in js un oggetto è visto come una funzione... lo prendo per un si?

  8. #8
    dipende - se usi prototype non proprio, ma io non sono un fan dell' uso di prototype. In realtà siccome la signature è una funzione ma poi la devi istanziare, non è più solo una funzione visto che va istanziata con la parola new.

    Diciamo che javascript, nonostante abbia una keyword detta class riservata, non ha vere e proprie classi, per cui le emuli. La maniera più diffusa è quella che ti indicavo io, con la parola chiave this: è la emulazione più vicina ad una classe che si possa fare in javascript.

    Se usi prototype è più corretto da un punto di vista "purista" ma a mio avviso ha degli svantaggi che non ha senso discutere qui adesso.

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683
    si esatto... anche perchè non capirei il javascript con più fatica rispetto ad altri linguaggi, però ne vengo a galla... ma le classi è ancora presto
    grazie mille, sei stato di un esaurienza impeccabile, grazie

  10. #10
    sono proprio due dei vari motivi per cui sconsiglio prototype ai principianti:

    1) è controintuitivo e quindi non lo capiscono
    2) siccome hai una alternativa molto più chiara, più simile alle sintassi tradizionali delle classi, e altrettanto funzionale...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.