Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116

    eval con variabile locale che non funziona

    codice:
    function Button1_onclick() 
    {
        var s = "ciao";
        mia_funzione1("alert(s)");
    }
    
    function mia_funzione1(codice)
    {
        window.setTimeout(function(){mia_funzione2(codice)}, 250);
    }
    
    function mia_funzione2(codice)
    {
        eval(codice);
    }
    Questo codice non funziona. Mi dà "s non è definito".
    Funziona solo se definisco s come globale.

    La domanda è se sia possibile utilizzare variabili locali, magari modificando il codice :master:
    Pietro

  2. #2
    Certo che funziona con le variabili locali. Il problema è questo:

    Tu nella prima funzione hai una variabile che si chiama s, perciò il codice che vai ad eseguire è "alert(s)". Fin qui, in teoria, tutto bene. Ma il codice non viene eseguito in quella funzione, bensì in un'altra funzione dove la variabile s non esiste. Quindi viene eseguito codice, ma ti restituisce un errore perchè s non esiste. Dovresti passare anche s oppure farla diventare globale.

  3. #3
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    fai attenzioe che window .setTimeout non puo' passare titpi complessi!!!!

    timeout passa solo titpo primitivi al contrario di eval che invece e' in grado di supportare tipi complessi.

    per far partire quel codeice devi fare

    Codice PHP:

    function Button1_onclick() 
    {
        var 
    "ciao";
        
    mia_funzione1("alert(s)");
    }

    function 
    mia_funzione1(codice)
    {
        
    window.setTimeout"mia_funzione2(\""+codice+"\")"250);
    }

    function 
    mia_funzione2(codice)
    {
        eval(
    codice);


  4. #4
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    basta spostare la dichiarazione di s nello scope globale (ovvero al di fuori della funzione)
    puoi anche assegnarla dentro la funzione, es:


    var s = "";

    function Button1_onclick() {
    s = "ciao";
    mia_funzione1("alert(s)");
    }

    ...


    Originariamente inviato da Virus_101
    fai attenzioe che window .setTimeout non puo' passare tipi complessi!!!!
    sta passando una semplice funzione

    Originariamente inviato da Virus_101
    per far partire quel codeice devi fare

    function mia_funzione1(codice)
    {
    window.setTimeout( "mia_funzione2(\""+codice+"\")", 250);
    }
    Assolutamente no. E' il modo peggiore di farlo, sia come tempi di esecuzione sia come leggibilità. Quella che ha scritto pietro è corretta
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  5. #5
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Naa basta passare tto come stringa
    Se nn hai dati strutturati ma solo tipi primitivi e' facile.

    Solo che maledetta ecma potevano fare una cosa piu' decente per fare animazioni.
    Sarebbe bastata la funzione sleep( int millisec ) !!!!!!!!!

    pero nn si sarebbe potuto treaddizzare .... e allora potevano si gestire con il timeout ma perche' devo passare la funzioe come stringa??? E se devo passarmi un oggettooo????
    E se la funzione e' un metodo di una classe???????

    Iddio maledica i linguaggi funzionali!!!!
    Se facevano un linguaggio ad oggetti era mjo.

    Mi fermo x non andare OT!

    Una funzione in js e' semplicemente una stringa anche a runtime

    prova a fare questo

    var test = function()
    {

    this.parla = function(){alert("moooo")}
    }

    var t = new test();
    alert(test.parla);

    test.parla();


    Beh era una soluzione!!!!
    Che funziona, vero che fa schifo ma nn puoi dire asoslutamente no!!!

  6. #6
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    Originariamente inviato da Virus_101
    Che funziona, vero che fa schifo ma nn puoi dire asoslutamente no!!!
    se copio la tua soluzione così come l'hai scritta più su, ovvero

    codice:
    function Button1_onclick()
    {
        var s = "ciao";
        mia_funzione1("alert(s)");
    }
    
    function mia_funzione1(codice)
    {
        window.setTimeout( "mia_funzione2(\""+codice+"\")", 250);
    }
    
    function mia_funzione2(codice)
    {
        eval(codice);
    }
    e poi provo ad eseguire la funzione Button1_onclick();
    ottiengo lo stesso errore che ottiene pietro (e in più il codice è rallentato)
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  7. #7
    Si ok Virus, ma il messaggio di errore dice che S non esiste, e per accorgersene il browser deve per forza cercare di eseguire codice.

    Il problema sta nel dove piazza s.

    Per quanto riguarda lo stile hai sicuramente ragione, ma sono cose che si imparano con l'esperienza e lavorando con altri programmatori, non leggendo un post su un forum. Oltretutto il suo è solo un esempio, dubito che il suo programma sia così come ce lo ha copiato

  8. #8
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Orpo adesso ho visto .... scusate

    vero sisis e' lo scope della var s.

    basta metterla fuori da tutto e funge

    EDIT: ho la sioluzioneeeeee
    Codice PHP:

    function Button1_onclick()
    {
        var 
    "ciao";
        
    mia_funzione1("alert(\""+s+"\")");


  9. #9
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    pietro se vuoi evitare di sporcare lo scope globale potresti risolvere con una funzione anonima, ad es,

    codice:
    (function() {
        var s;
    
        function Button1_onclick() {
            s = "ciao";
            mia_funzione1("alert(s)");
        }
    
        function mia_funzione1(codice) {
            window.setTimeout(function(){
                mia_funzione2(codice)
            }, 250);
        }
    
        function mia_funzione2(codice) {
            eval(codice);
        }
    
        Button1_onclick();
    })();
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  10. #10
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    vi ringrazio delle risposte.
    Il codice che ho scritto riassume molto sinteticamente questo.

    Ho due pulsanti, A e B.
    Premo A per eseguire una azione
    Attendo che B sia disponibile (la risposta del server)
    Premo B per eseguire un'altra azione.


    Non posso fare:

    funzione_A(); funzione_B(); perchè funzione_B() può partire solo se il sistema si è liberato

    Ho risolto con:

    funzione_A(); mia_funzione("funzione_B()");

    dove mia_funzione controlla il "semaforo". Se è rosso richiama se stessa con setinterval, se è verde fa l'Eval della funzione passata come argomento.

    Funziona, ma se avete qualche consiglio in merito, ve ne sarei davvero grato.

    Pietro

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.