-
Bug in javascriptScritto daNon Autenticatoil 2017-03-15 13:55:02.0 alle 2017-03-15 13:55:02.0Per 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.-
Re: Bug in javascriptScritto daNon Autenticatoil 2017-03-15 18:21:51.0 alle 2017-03-15 18:21:51.0Ok, 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); }
-
Re: Bug in javascriptScritto daNon Autenticatoil 2017-03-15 19:16:14.0 alle 2017-03-15 19:16:14.0Scritto 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
-
Re: Bug in javascriptScritto daNon Autenticatoil 2017-03-15 19:29:06.0 alle 2017-03-15 19:29:06.0Scritto 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
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 praticavar 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.
-
Re: Bug in javascriptScritto daAlessandrox(XYZ)Trollil 2017-03-16 12:55:54.0 alle 2017-03-16 12:55:54.0Trollate totali: 11553Già troppo permissivi
Ma smettila di secernere cazzate!-
Re: Bug in javascriptScritto daNon Autenticatoil 2017-03-16 17:23:24.0 alle 2017-03-16 17:23:24.0Scritto da: Alessandrox
> Già troppo permissivi
Che cosa?
I tre linguaggi menzionati hanno regole chiare che non puoi violare.
-
-
Re: Bug in javascriptScritto daWakko WarnerWakkus Horribilisil 2017-03-16 17:34:24.0 alle 2017-03-16 17:34:24.0Trollate totali: 6779Scritto 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
>
> 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.

**Modificato dall'autore il 16.03.2017 17:40**Gli Svizzeri non sono tutti ricchi - Mattia-
Re: Bug in javascriptScritto daNon Autenticatoil 2017-03-16 18:21:20.0 alle 2017-03-16 18:21:20.0Scritto da: Wakko Warner
> https://dartpad.dartlang.org/
Come funziona? Viene tradotto in javascript?-
Re: Bug in javascriptScritto daWakko WarnerWakkus Horribilisil 2017-03-16 18:30:07.0 alle 2017-03-16 18:30:07.0Trollate totali: 6779Scritto 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-
Re: Bug in javascriptScritto daNon Autenticatoil 2017-03-16 23:46:22.0 alle 2017-03-16 23:46:22.0Scritto 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?
-
Re: Bug in javascriptScritto daWakko WarnerWakkus Horribilisil 2017-03-17 02:23:45.0 alle 2017-03-17 02:23:45.0Trollate totali: 6779Scritto 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-
Re: Bug in javascriptScritto daNon Autenticatoil 2017-03-17 18:38:32.0 alle 2017-03-17 18:38:32.0Scritto 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.-
Re: Bug in javascriptScritto daWakko WarnerWakkus Horribilisil 2017-03-17 19:11:51.0 alle 2017-03-17 19:11:51.0Trollate totali: 6779Scritto da:
> 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.
Tipo così?
https://dartpad.dartlang.org/9e5de9b004561ceee7bd7...
**Modificato dall'autore il 17.03.2017 19:29**Gli Svizzeri non sono tutti ricchi - Mattia-
Re: Bug in javascriptScritto daNon Autenticatoil 2017-03-17 20:10:59.0 alle 2017-03-17 20:10:59.0Scritto da: Wakko Warner
> Scritto da:
> > 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.
>
> Tipo così?
> https://dartpad.dartlang.org/9e5de9b004561ceee7bd7...
>
>
> **Modificato dall'autore il 17.03.2017 19:29**
Si, tipo così.
-
-
-
-
-
-
-
-
-
-
-