Mostra notizie nelle discussioni
  • Avatar
    Scritto da
    Non Autenticato
    il 2017-03-15 13:55:02.0 alle 2017-03-15 13:55:02.0
    Bug in javascript
    Per essere sicuro: la funzione onImageClick dentro il ciclo for viene ricreata a ogni iterazione, giusto?

    this._buildImageGallery = function()
    {
            var table = new ElementBuilder("table")
                .getElement();
    
            var row = new ElementBuilder("tr").getElement();
            table.appendChild(row);
    
            for(var k=1; k <= this._paths.length; k++)
            {
                var path = this._paths[k - 1];
    
                var image = new ElementBuilder("img")
                    .withAttribute("src", path)
                    .withAttribute("height", "50")
                    .withAttribute("width", "50")
                    .withStyle("cursor", "pointer")
                    .withClickEventListener(onImageClick)
                    .getElement();
    
                row.appendChild(new ElementBuilder("td").withChild(image).getElement());
    
                if(k % 8 == 0)
                {
                    //table.appendChild(row);
                    row = document.createElement("tr");
                    table.appendChild(row);
                }
    
                function onImageClick()
                {
                    This._setPath(path);
                }
            }
    
            var container = new ElementBuilder("div")
                .withStyle("backgroundColor", "#616161")
                //.withStyle("width", "100%")
                .withChild(table)
                .getElement();
    
            this._container.appendChild(container);
    }



    E dunque perché parrebbe che l'event handler di ogni immagine sia legato a una funzione con la stessa path? Cioè, la path che viene passata al metodo setPath è sempre la stessa, per ogni immagine.
    • Avatar
      Scritto da
      Non Autenticato
      il 2017-03-15 18:21:51.0 alle 2017-03-15 18:21:51.0
      Re: Bug in javascript
      Ok, ho capito l'errore.

      In javascript le variabili normali (var) appartengono allo scope della funzione, anche quando vengono dichiarate in un blocco.

      Per avere variabili che appartengono unicamente allo scope del blocco bisogna dichiararle come "let" anziché come "var".

      Quindi nel codice sopra la variabile path, appartenendo allo scope della funzione, non viene distrutta a ogni iterazione, ma viene modificata.

      Utilizzando let invece viene distrutta e ricreata a ogni iterazione e quindi ogni funzione avrà un path differente.

      Un'altra soluzione, anziché usare let, è appicciare la funzione all'event handler in questa maniera.

      var image = new ElementBuilder("img")
                      .withAttribute("src", path)
                      .withAttribute("height", "50")
                      .withAttribute("width", "50")
                      .withStyle("cursor", "pointer")
                      .withClickEventListener(onImageClick.bind(null, path))
                      .getElement();


      E modificare la funzione onImageClick in maniera tale che prenda la path come parametro, anziché dallo scope.

      function onImageClick(path)
      {
         This._setPath(path);
      }

      • Avatar
        Scritto da
        Non Autenticato
        il 2017-03-15 19:16:14.0 alle 2017-03-15 19:16:14.0
        Re: Bug in javascript
        Scritto da:
        > Ok, ho capito l'errore.
        >
        > In javascript le variabili normali (var) appartengono allo scope della funzione, anche quando vengono dichiarate in un blocco.
        >
        > Per avere variabili che appartengono unicamente allo scope del blocco bisogna dichiararle come "let" anziché come "var".
        >
        > Quindi nel codice sopra la variabile path, appartenendo allo scope della funzione, non viene distrutta a ogni iterazione, ma viene modificata.
        >
        > Utilizzando let invece viene distrutta e ricreata a ogni iterazione e quindi ogni funzione avrà un path differente.
        >
        > Un'altra soluzione, anziché usare let, è appicciare la funzione all'event handler in questa maniera.
        >
        >
        var image = new ElementBuilder("img")
        > .withAttribute("src", path)
        > .withAttribute("height", "50")
        > .withAttribute("width", "50")
        > .withStyle("cursor", "pointer")
        > .withClickEventListener(onImageClick.bind(null, path))
        > .getElement();

        >
        > E modificare la funzione onImageClick in maniera tale che prenda la path come parametro, anziché dallo scope.
        >
        >
        function onImageClick(path)
        > {
        > This._setPath(path);
        > }


        Trovare la risposta da solo è sempre la cosa migliore Licchione
        • Avatar
          Scritto da
          Non Autenticato
          il 2017-03-15 19:29:06.0 alle 2017-03-15 19:29:06.0
          Re: Bug in javascript
          Scritto da:
          > Scritto da:
          > > Ok, ho capito l'errore.
          > >
          > > In javascript le variabili normali (var) appartengono allo scope della funzione, anche quando vengono dichiarate in un blocco.
          > >
          > > Per avere variabili che appartengono unicamente allo scope del blocco bisogna dichiararle come "let" anziché come "var".
          > >
          > > Quindi nel codice sopra la variabile path, appartenendo allo scope della funzione, non viene distrutta a ogni iterazione, ma viene modificata.
          > >
          > > Utilizzando let invece viene distrutta e ricreata a ogni iterazione e quindi ogni funzione avrà un path differente.
          > >
          > > Un'altra soluzione, anziché usare let, è appicciare la funzione all'event handler in questa maniera.
          > >
          > >
          var image = new ElementBuilder("img")
          > > .withAttribute("src", path)
          > > .withAttribute("height", "50")
          > > .withAttribute("width", "50")
          > > .withStyle("cursor", "pointer")
          > > .withClickEventListener(onImageClick.bind(null, path))
          > > .getElement();

          > >
          > > E modificare la funzione onImageClick in maniera tale che prenda la path come parametro, anziché dallo scope.
          > >
          > >
          function onImageClick(path)
          > > {
          > > This._setPath(path);
          > > }

          >
          > Trovare la risposta da solo è sempre la cosa migliore Licchione

          Me l'hanno data la risposta.

          Io non sapevo che javascript facesse schifo fino a questo punto, anche per via del fatto che a quanto pare puoi dichiarare una variabile infinite volte e senza che il codice dia errore alcuno.

          In pratica

          var a = 2;
          var a = 3;
          var a = 4;
          


          In javascript è una cosa regolare e non è che la variabile venga distrutta e ricreata di volta in volta, semplicemente viene tenuta la prima dichiarazione e tutto quello che segue viene trasformato in un'assegnazione.

          var a = 2;
          a = 3;
          a = 4;
          


          Java, C e C# (i linguaggi seri) col cazzo che ti lasciano scrivere una merdata del genere.





          • Avatar
            ☺
            Scritto da
            Wakko Warner
            Wakkus Horribilis
            il 2017-03-16 17:34:24.0 alle 2017-03-16 17:34:24.0
            Trollate totali: 6779
            Re: Bug in javascript
            Scritto da:
            > Scritto da:
            > > Scritto da:
            > > > Ok, ho capito l'errore.
            > > >
            > > > In javascript le variabili normali (var) appartengono allo scope della funzione, anche quando vengono dichiarate in un blocco.
            > > >
            > > > Per avere variabili che appartengono unicamente allo scope del blocco bisogna dichiararle come "let" anziché come "var".
            > > >
            > > > Quindi nel codice sopra la variabile path, appartenendo allo scope della funzione, non viene distrutta a ogni iterazione, ma viene modificata.
            > > >
            > > > Utilizzando let invece viene distrutta e ricreata a ogni iterazione e quindi ogni funzione avrà un path differente.
            > > >
            > > > Un'altra soluzione, anziché usare let, è appicciare la funzione all'event handler in questa maniera.
            > > >
            > > >
            var image = new ElementBuilder("img")
            > > > .withAttribute("src", path)
            > > > .withAttribute("height", "50")
            > > > .withAttribute("width", "50")
            > > > .withStyle("cursor", "pointer")
            > > > .withClickEventListener(onImageClick.bind(null, path))
            > > > .getElement();

            > > >
            > > > E modificare la funzione onImageClick in maniera tale che prenda la path come parametro, anziché dallo scope.
            > > >
            > > >
            function onImageClick(path)
            > > > {
            > > > This._setPath(path);
            > > > }

            > >
            > > Trovare la risposta da solo è sempre la cosa migliore Licchione
            >
            > Me l'hanno data la risposta.
            >
            > Io non sapevo che javascript facesse schifo fino a questo punto, anche per via del fatto che a quanto pare puoi dichiarare una variabile infinite volte e senza che il codice dia errore alcuno.
            >
            > In pratica
            >
            >
            > var a = 2;
            > var a = 3;
            > var a = 4;
            > 

            >
            > In javascript è una cosa regolare e non è che la variabile venga distrutta e ricreata di volta in volta, semplicemente viene tenuta la prima dichiarazione e tutto quello che segue viene trasformato in un'assegnazione.
            >
            >
            > var a = 2;
            > a = 3;
            > a = 4;
            > 

            >
            > Java, C e C# (i linguaggi seri) col cazzo che ti lasciano scrivere una merdata del genere.

            Javascript è merda. L'unico motivo per cui è così largamente usato è che purtroppo è l'unico linguaggio supportato da tutti i browser "out of the box". Dart è un linguaggio decisamente più serio.

            https://dartpad.dartlang.org/

            Prova a scrivere:
            int a = 2;
            int a = 3;


            Duplicate definition of 'a'.
            Try to rename or remove this definition.


            Ficoso

            **Modificato dall'autore il 16.03.2017 17:40**
            Gli Svizzeri non sono tutti ricchi - Mattia
            • Avatar
              Scritto da
              Non Autenticato
              il 2017-03-16 18:21:20.0 alle 2017-03-16 18:21:20.0
              Re: Bug in javascript
              Scritto da: Wakko Warner
              > https://dartpad.dartlang.org/

              Come funziona? Viene tradotto in javascript?
              • Avatar
                ☺
                Scritto da
                Wakko Warner
                Wakkus Horribilis
                il 2017-03-16 18:30:07.0 alle 2017-03-16 18:30:07.0
                Trollate totali: 6779
                Re: Bug in javascript
                Scritto da:
                > Scritto da: Wakko Warner
                > > https://dartpad.dartlang.org/
                >
                > Come funziona? Viene tradotto in javascript?

                Inizialmente aveva una sua VM nel browser, più veloce di quella di V8.

                Poi siccome Mozilla e M$ si sono lagnati e si sono messi a sbattere i piedi a terra Google ha deciso invece di seguire la strada della "compilazione" in JS. Esiste ancora una VM per farlo funzionare stand-alone se non sbaglio ma nei browser viene convertito in JS.

                Getting started:
                https://www.dartlang.org/guides/get-started

                Alcuni esempi:
                https://www.dartlang.org/samples

                **Modificato dall'autore il 16.03.2017 18:33**
                Gli Svizzeri non sono tutti ricchi - Mattia
                • Avatar
                  Scritto da
                  Non Autenticato
                  il 2017-03-16 23:46:22.0 alle 2017-03-16 23:46:22.0
                  Re: Bug in javascript
                  Scritto da: Wakko Warner
                  > Scritto da:
                  > > Scritto da: Wakko Warner
                  > > > https://dartpad.dartlang.org/
                  > >
                  > > Come funziona? Viene tradotto in javascript?
                  >
                  > Inizialmente aveva una sua VM nel browser, più veloce di quella di V8.
                  >
                  > Poi siccome Mozilla e M$ si sono lagnati e si sono messi a sbattere i piedi a terra Google ha deciso invece di seguire la strada della "compilazione" in JS. Esiste ancora una VM per farlo funzionare stand-alone se non sbaglio ma nei browser viene convertito in JS.

                  Ma le VM erano installate di default nei browser, oppure gli utenti se la dovevano installare?


                  > Getting started:
                  > https://www.dartlang.org/guides/get-started
                  >
                  > Alcuni esempi:
                  > https://www.dartlang.org/samples

                  Credo che ci siano tante alternative a javascript, perché consigli proprio dart e non altri linguaggi?

                  • Avatar
                    ☺
                    Scritto da
                    Wakko Warner
                    Wakkus Horribilis
                    il 2017-03-17 02:23:45.0 alle 2017-03-17 02:23:45.0
                    Trollate totali: 6779
                    Re: Bug in javascript
                    Scritto da:
                    > Ma le VM erano installate di default nei browser, oppure gli utenti se la dovevano installare?

                    L'obiettivo di Google era quello di inserire la VM in Chrome e poi farla adottare anche agli altri browser. La VM era installata di default solo in Dartium https://webdev.dartlang.org/tools/dartium usata per lo sviluppo, una sorta di "preview" di quello che avrebbe dovuto essere.

                    Vado un po' a memoria...
                    Gli script Dart erano/sono in grado di funzionare a prescindere dalla VM perché se la VM non era presente potevano passare alla versione "compilata" in JS, solo che con la VM giravano molto più velocemente perché:

                    1) Dart è studiato per essere ottimizzato in modi che con JS non puoi fare (come ho detto la DartVM è più veloce di V8)

                    2) La VM di Dart era in grado di sfruttare caratteristiche della CPU come le istruzioni SIMD (che all'epoca ~2013 non erano supportate in JS, ora onestamente non lo so)
                    Qui verso il minuto 50 del video c'è una demo con un'animazione 3D al riguardo di quanta potenza si potesse spremere dalla CPU con DartVM e SIMD abilitato


                    3) Con la VM di Dart è possibile fare uno "snapshot" [VM Snapshots] della memoria con il programma già interpretato e pronto all'esecuzione (una sorta di "eseguibile"), così da risparmiare in fase di avvio il tempo dovuto all'interpretazione dei comandi [l'avvio credo fosse 10 volte più veloce con gli snaphost]

                    4) L'intera VM di Dart era stata pensata per ottimizzare al massimo la velocità di esecuzione e di avvio, questo anche grazie al fatto che Dart è un linguaggio più pulito di JS

                    In alcuni casi comunque anche il codice scritto in Dart e "compilato" in JS è più veloce di un programma scritto in JS nativamente.
                    https://www.infoq.com/news/2013/04/dart2js-outperf...

                    Qui parla dei vari vantaggi di Dart con un video introduttivo


                    > Credo che ci siano tante alternative a javascript, perché consigli proprio dart e non altri linguaggi?

                    Perché Dart è un linguaggio, gli altri sono al limite "decorazioni" e miglioramenti qua e là basati su javascript. Dart non è javascript, typescript e coffescript al limite sono "superset" di javascript.

                    Dart nasce come alternativa a Javascript, un linguaggio nuovo, moderno, efficente, veloce, facile da imparare e da capire, con supporto alla programmazione ad oggetti, alle interfacce, librerie, ha persino gli async e await che trovi in C# in modo da semplificare lo sviluppo di applicazioni client anche grosse e permetterti di scrivere un codice leggibile e comprensibile... insomma, Dart è tutta un'altra bestia.
                    Gli Svizzeri non sono tutti ricchi - Mattia
                    • Avatar
                      Scritto da
                      Non Autenticato
                      il 2017-03-17 18:38:32.0 alle 2017-03-17 18:38:32.0
                      Re: Bug in javascript
                      Scritto da: Wakko Warner
                      > Scritto da:
                      > > Ma le VM erano installate di default nei browser, oppure gli utenti se la dovevano installare?
                      >
                      > L'obiettivo di Google era quello di inserire la VM in Chrome e poi farla adottare anche agli altri browser. La VM era installata di default solo in Dartium https://webdev.dartlang.org/tools/dartium usata per lo sviluppo, una sorta di "preview" di quello che avrebbe dovuto essere.
                      >
                      > Vado un po' a memoria...
                      > Gli script Dart erano/sono in grado di funzionare a prescindere dalla VM perché se la VM non era presente potevano passare alla versione "compilata" in JS, solo che con la VM giravano molto più velocemente perché:
                      >
                      > 1) Dart è studiato per essere ottimizzato in modi che con JS non puoi fare (come ho detto la DartVM è più veloce di V8)
                      >
                      > 2) La VM di Dart era in grado di sfruttare caratteristiche della CPU come le istruzioni SIMD (che all'epoca ~2013 non erano supportate in JS, ora onestamente non lo so)
                      > Qui verso il minuto 50 del video c'è una demo con un'animazione 3D al riguardo di quanta potenza si potesse spremere dalla CPU con DartVM e SIMD abilitato
                      >
                      >
                      > 3) Con la VM di Dart è possibile fare uno "snapshot" [VM Snapshots] della memoria con il programma già interpretato e pronto all'esecuzione (una sorta di "eseguibile"), così da risparmiare in fase di avvio il tempo dovuto all'interpretazione dei comandi [l'avvio credo fosse 10 volte più veloce con gli snaphost]
                      >
                      > 4) L'intera VM di Dart era stata pensata per ottimizzare al massimo la velocità di esecuzione e di avvio, questo anche grazie al fatto che Dart è un linguaggio più pulito di JS

                      Ok, ho capito.


                      > > Credo che ci siano tante alternative a javascript, perché consigli proprio dart e non altri linguaggi?
                      >
                      > Perché Dart è un linguaggio, gli altri sono al limite "decorazioni" e miglioramenti qua e là basati su javascript. Dart non è javascript, typescript e coffescript al limite sono "superset" di javascript.
                      >
                      > Dart nasce come alternativa a Javascript, un linguaggio nuovo, moderno, efficente, veloce, facile da imparare e da capire, con supporto alla programmazione ad oggetti, alle interfacce, librerie, ha persino gli async e await che trovi in C# in modo da semplificare lo sviluppo di applicazioni client anche grosse e permetterti di scrivere un codice leggibile e comprensibile... insomma, Dart è tutta un'altra bestia.


                      Javascript ha comunque qualcosa di positivo, come ad esempio il fatto che le funzioni sono dati come tutto il resto e quindi si possono inserire nelle variabili e passare in parametro ad altre funzioni.

                      Per ottenere lo stesso risultato in altri linguaggi devi utilizzare i delegati, che rendono il codice un po' più complicato e più difficile da capire per chi sta imparando.
<softv>

Pagina generata in 413 millisecondi

Utenti attivi: 10 nell'ultimo minuto, 16 negli ultimi cinque minuti, 40 negli ultimi 15 minuti