-
[JS] lich eiutohttp://pastebin.com/p8vdukUf

E' un bug il fatto che (almeno in firefoz) all'interno della funzione anonima la reference di span viene risolta sempre con l'ultima del ciclo oppure mi sfugge qualcosa sullo scoping delle var in javascript?
In questo esempio il text node 'testo' viene aggiunto sempre all'ultimo degli span.-
Re: [JS] lich eiuto- Scritto da: suoranciata
> http://pastebin.com/p8vdukUf
>
> E' un bug il fatto che (almeno in firefoz)
> all'interno della funzione anonima la reference
> di span viene risolta sempre con l'ultima del
> ciclo oppure mi sfugge qualcosa sullo scoping
> delle var in
> javascript?
> In questo esempio il text node 'testo' viene
> aggiunto sempre all'ultimo degli
> span.
La soluzione: http://pastebin.com/9dWVCcex
Interessante questo link che spiega dove sbagliavo:
http://robertnyman.com/2008/10/09/explaining-javas...
-
Re: [JS] lich eiuto
- Scritto da: suoranciata
> La soluzione: http://pastebin.com/9dWVCcex
> Interessante questo link che spiega dove
> sbagliavo:
> http://robertnyman.com/2008/10/09/explaining-javas
tl;dr
La risposta di Giambo era corretta ?
[ ] SI
[ ] NO
KTNKBAI`"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo-
Re: [JS] lich eiuto- Scritto da: Giambo
>
> - Scritto da: suoranciata
>
> > La soluzione: http://pastebin.com/9dWVCcex
> > Interessante questo link che spiega dove
> > sbagliavo:
> >
> http://robertnyman.com/2008/10/09/explaining-javas
>
> tl;dr
>
> La risposta di Giambo era corretta ?
> [ ] SI
> [ ] NO
>
> KTNKBAI
Ma è una lettura interessante!
Togli subito quel tl;dr!
E leggi i pvt
-
Re: [JS] lich eiuto
- Scritto da: suoranciata
> Ma è una lettura interessante!
> Togli subito quel tl;dr!
Occhei capo
!
> E leggi i pvt
Occhei amore
...
`"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo
-
-
-
-
Re: [JS] lich eiutoPrima di tutto e' peccato mortale accedere dalla funzione anonima ad una variabile esterna.
Java piangerebbe, e pure Gesu' Bambino.
IMHO e' "colpa" del compilatore JS di FF, una sfortunata combinazione di loop-unroll e reordening delle operazioni.
Il compilatore vede che attacchi agli elementi la medesima funzione, quindi cosa fa ? Aspetta la fine del loop e attacca a tutti gli elementi la funzione. La quale referenzia l'ultimo valore di "span". BUM, HEADSHOT !
Una soluzione potrebbe essere quella di "legare" span e link in qualche modo: Della funzione anonima quindi puoi risalire allo span dal link.
`"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo-
Re: [JS] lich eiutoScritto daNon Autenticatoil 2010-09-14 10:20:00.0 alle 2010-09-14 10:20:00.0- Scritto da: Giambo
> Prima di tutto e' peccato mortale accedere dalla
> funzione anonima ad una variabile
> esterna.
> Java piangerebbe, e pure Gesu' Bambino.
>
> IMHO e' "colpa" del compilatore JS di FF, una
> sfortunata combinazione di loop-unroll e
> reordening delle
> operazioni.
>
> Il compilatore vede che attacchi agli elementi la
> medesima funzione, quindi cosa fa ? Aspetta la
> fine del loop e attacca a tutti gli elementi la
> funzione. La quale referenzia l'ultimo valore di
> "span". BUM, HEADSHOT
> !
>
> Una soluzione potrebbe essere quella di "legare"
> span e link in qualche modo: Della funzione
> anonima quindi puoi risalire allo span dal
> link.
-
Re: [JS] lich eiuto
- Scritto da: Giambo
> Prima di tutto e' peccato mortale accedere dalla
> funzione anonima ad una variabile
> esterna.
> Java piangerebbe, e pure Gesu' Bambino.
È una cosa comune in Javascript, soprattutto dove hai funzioni anonime a cui non puoi passare altri argomenti oltre a quelli previsti (tipo appunto quando assegni funzioni ad eventi, le funzioni possono avere solo determinati argomenti).
Lo stesso problema si ha in questo codice di test che ho scritto:z = new Array(); function test() { for (var i=0; i<10; i++) { z[i] = function(e) { alert(i); } } } test(); for (var h=0; h<10; h++) { z[h](); }
Javascript non crea ad ogni assegnazione (ad ogni ciclo) una nuova variabile i, passa alla funzione anonima il riferimento a quella variabile, il loop incrementa i e così, quando la funzione anonima è chiamata, viene chiamata NON con il valore di i in cui è creata, ma con il _riferimento_ di i e così succede che tutte le chiamate valutano i a 10 come risultato.
La variabile i continuerà ad esistere finché l'array z non sarà distrutto.
Probabilmente anche nel caso di suoranciata la variabile span viene creata una sola volta e poi riutilizzata (il suo riferimento viene riutilizzato) ad ogni assegnazione successiva.
In questo modo "span" contiene sempre l'ultimo valore.
Forse c'è qualche simbolo o comando per forzare javascript a ricreare un nuovo riferimento in memoria, pensavo che "var" bastasse, evidentemente non è così.-
Re: [JS] lich eiutoOk, risolto.

z = new Array(); function test() { for (var i=0; i<10; i++) { (function (i) { z[i] = function(e) { alert(i); } })(i); } } test(); for (var h=0; h<10; h++) { z[h](); }
Ha del raccapricciante, vero?
-
Re: [JS] lich eiutoIn teoria lo stesso risultato lo si può ottenere in modo più elegante con la keyword "let".
https://developer.mozilla.org/en/New_in_JavaScript...
Ma non rieso a farla funzionare e non so perché... (bug in javascript/firebug/boh?)
-----------------------------------------------------------
Modificato dall' autore il 14 settembre 2010 11.28
------------------------------------------------------------
Re: [JS] lich eiutoPare essere un problema di Firebug, probabilmente non riconosce il comando "let".
Non ho potuto provarla, ma credo che la versione seguente funzioni.
In pratica "let" introduce un nuovo scope ad ogni ciclo in cui il valore di i viene assegnato ad una nuova variabile n (ad ogni ciclo diversa).z = new Array(); function test() { for (var i=0; i<10; i++) { let (n=i) { z[i] = function(e) { alert(n); } } } } test(); for (var h=0; h<10; h++) { z[h](); }
-
-
Re: [JS] lich eiuto> Ha del raccapricciante, vero?

No, e` quel che dicevo io: spingerlo esplicitamente a creare una variabile i all'interno della funzione anonima, passargli la palla con chiarezza insomma.
-
-
Re: [JS] lich eiuto
- Scritto da: Rin Kobayashi
> Javascript non crea ad ogni assegnazione (ad ogni
> ciclo) una nuova variabile i
D'oh
!
Ma qvesto ezzere perkolozizzimo
!!
La suoraspremuta pero' diceva che succedeva solo con <s>VolpeDiFuoco</s> <s>PandaRosso</s> BrowserComunista, ecco perche' mi sono fatto le seghe pensando ai loop unroll e altre ottimizzazioni
!
`"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo
-
Re: [JS] lich eiuto> Javascript non crea ad ogni assegnazione (ad ogni
> ciclo) una nuova variabile i, passa alla funzione
> anonima il riferimento a quella variabile, il
> loop incrementa i e così, quando la funzione
> anonima è chiamata, viene chiamata NON con il
> valore di i in cui è creata, ma con il
> _riferimento_ di i e così succede che tutte le
> chiamate valutano i a 10 come
> risultato.
Ehm... per quanto mi riguarda, e` quel che mi aspetterei. Insomma do` ragione all'interprete Javascript. Il fatto che i sia esterna alla funzione anonima, nello scope della parent function, e` una cosa spinosa: avessi fissato io le regole, avrei tirato su un errore e detto che non puoi accedere ad i dalla riga "alert (i)" perche` li` i non esiste. E poi suggerito di passarla come argomento alla funzione anonima, al che l'interprete avrebbe creato una variabile locale nello scope della funzione anonima.
-
Re: [JS] lich eiutoScritto daNon Autenticatoil 2010-09-14 12:25:00.0 alle 2010-09-14 12:25:00.0- Scritto da: alex.tg
> > Javascript non crea ad ogni assegnazione (ad
> ogni
> > ciclo) una nuova variabile i, passa alla
> funzione
> > anonima il riferimento a quella variabile, il
> > loop incrementa i e così, quando la funzione
> > anonima è chiamata, viene chiamata NON con il
> > valore di i in cui è creata, ma con il
> > _riferimento_ di i e così succede che tutte le
> > chiamate valutano i a 10 come
> > risultato.
>
> Ehm... per quanto mi riguarda, e` quel che mi
> aspetterei. Insomma do` ragione all'interprete
> Javascript. Il fatto che i sia esterna alla
> funzione anonima, nello scope della parent
> function, e` una cosa spinosa: avessi fissato io
> le regole, avrei tirato su un errore e detto che
> non puoi accedere ad i dalla riga "alert (i)"
> perche` li` i non esiste. E poi suggerito di
> passarla come argomento alla funzione anonima, al
> che l'interprete avrebbe creato una variabile
> locale nello scope della funzione anonima.
>
si chiamano closures, è una tecnica normalissima e molto utile, e non ce l'ha solo javascript ma ogni linguaggio che supporta le funzioni anonime.-
Re: [JS] lich eiuto> si chiamano closures, è una tecnica normalissima
> e molto utile, e non ce l'ha solo javascript ma
> ogni linguaggio che supporta le funzioni
> anonime.
Questa mania della privacy sta rovinando tutto.
-
-
-
-
-
Re: [JS] lich eiutoScritto daNon Autenticatoil 2010-09-14 13:35:00.0 alle 2010-09-14 13:35:00.0ma cosa vuoi che ne capisca il licchione
-
Re: [JS] lich eiuto- Scritto da:
> ma cosa vuoi che ne capisca il licchione
E tu invece? Lui si che è un uberprogrammer
-
-
Re: [JS] lich eiutoScritto daavvelentaniCubicolarioil 2010-09-14 16:53:00.0 alle 2010-09-14 16:53:00.0Trollate totali: 18184
- Scritto da: suoranciata
> http://pastebin.com/p8vdukUf
>
> E' un bug il fatto che (almeno in firefoz)
> all'interno della funzione anonima la reference
> di span viene risolta sempre con l'ultima del
> ciclo oppure mi sfugge qualcosa sullo scoping
> delle var in
> javascript?
> In questo esempio il text node 'testo' viene
> aggiunto sempre all'ultimo degli
> span.
se non sbaglio lo standard dice che in javascript i binding esistono tutti al livello di funzione. Un semplice blocco non introduce un nuovo binding frame, di conseguenza tutte le funzioni anonime che stai creando sono chiuse sulla stessa variabile.I think happiness is love
- Vladimir Putin-
Re: [JS] lich eiutoScritto daNon Autenticatoil 2010-09-14 17:13:00.0 alle 2010-09-14 17:13:00.0
- Scritto da: avvelentani
>
> - Scritto da: suoranciata
> > http://pastebin.com/p8vdukUf
> >
> > E' un bug il fatto che (almeno in firefoz)
> > all'interno della funzione anonima la reference
> > di span viene risolta sempre con l'ultima del
> > ciclo oppure mi sfugge qualcosa sullo scoping
> > delle var in
> > javascript?
> > In questo esempio il text node 'testo' viene
> > aggiunto sempre all'ultimo degli
> > span.
>
> se non sbaglio lo standard dice che in javascript
> i binding esistono tutti al livello di funzione.
> Un semplice blocco non introduce un nuovo binding
> frame, di conseguenza tutte le funzioni anonime
> che stai creando sono chiuse sulla stessa
> variabile.
porca madonna, lo sapevo!
-
-
Re: [JS] lich eiuto
- Scritto da: suoranciata
> http://pastebin.com/p8vdukUf
>
> E' un bug il fatto che (almeno in firefoz)
> all'interno della funzione anonima la reference
> di span viene risolta sempre con l'ultima del
> ciclo oppure mi sfugge qualcosa sullo scoping
> delle var in
> javascript?
> In questo esempio il text node 'testo' viene
> aggiunto sempre all'ultimo degli
> span.
E' normale, se fossi un vero prog skilled lo sapresti.
-
Re: [JS] lich eiuto
- Scritto da: suoranciata
> http://pastebin.com/p8vdukUf
>
> E' un bug il fatto che (almeno in firefoz)
> all'interno della funzione anonima la reference
> di span viene risolta sempre con l'ultima del
> ciclo oppure mi sfugge qualcosa sullo scoping
> delle var in
> javascript?
> In questo esempio il text node 'testo' viene
> aggiunto sempre all'ultimo degli
> span.
Io comunque ti consiglio, dato che lo standard dice che in javascript i binding esistono tutti al livello di funzione, di considerare che un semplice blocco non introduce un nuovo binding frame, di conseguenza tutte le funzioni anonime che stai creando sono chiuse sulla stessa variabile.-
Re: [JS] lich eiuto> Io comunque ti consiglio, dato che lo standard
> dice che in javascript i binding esistono tutti
> al livello di funzione, di considerare che un
> semplice blocco non introduce un nuovo binding
> frame, di conseguenza tutte le funzioni anonime
> che stai creando sono chiuse sulla stessa
> variabile.
Io invece ti consiglio, dato che per ogni passaggio a livello c'e` un binding, di considerare che un semplice blocco non introduce un segnalatore acustico per il frame attorno ai binari, di conseguenza tutti i passanti anonimi ciechi sono chiusi tra le sbarre e il treno li investira`!
-
Re: [JS] lich eiuto
- Scritto da: alex.tg
> > Io comunque ti consiglio, dato che lo standard
> > dice che in javascript i binding esistono tutti
> > al livello di funzione, di considerare che un
> > semplice blocco non introduce un nuovo binding
> > frame, di conseguenza tutte le funzioni anonime
> > che stai creando sono chiuse sulla stessa
> > variabile.
>
> Io invece ti consiglio, dato che per ogni
> passaggio a livello c'e` un binding, di
> considerare che un semplice blocco non introduce
> un segnalatore acustico per il frame attorno ai
> binari, di conseguenza tutti i passanti anonimi
> ciechi sono chiusi tra le sbarre e il treno li
> investira`!
>
Vuoi un consiglio? Ne ho tanti da dare!
-
-
Re: [JS] lich eiutoScritto daavvelentaniCubicolarioil 2010-09-14 19:16:00.0 alle 2010-09-14 19:16:00.0Trollate totali: 18184
- Scritto da: Avve TheFail
>
> - Scritto da: suoranciata
> > http://pastebin.com/p8vdukUf
> >
> > E' un bug il fatto che (almeno in firefoz)
> > all'interno della funzione anonima la reference
> > di span viene risolta sempre con l'ultima del
> > ciclo oppure mi sfugge qualcosa sullo scoping
> > delle var in
> > javascript?
> > In questo esempio il text node 'testo' viene
> > aggiunto sempre all'ultimo degli
> > span.
>
> Io comunque ti consiglio, dato che lo standard
> dice che in javascript i binding esistono tutti
> al livello di funzione, di considerare che un
> semplice blocco non introduce un nuovo binding
> frame, di conseguenza tutte le funzioni anonime
> che stai creando sono chiuse sulla stessa
> variabile.
I think happiness is love
- Vladimir Putin-
Re: [JS] lich eiuto
- Scritto da: avvelentani
>
> - Scritto da: Avve TheFail
> >
> > - Scritto da: suoranciata
> > > http://pastebin.com/p8vdukUf
> > >
> > > E' un bug il fatto che (almeno in firefoz)
> > > all'interno della funzione anonima la
> reference
> > > di span viene risolta sempre con l'ultima del
> > > ciclo oppure mi sfugge qualcosa sullo scoping
> > > delle var in
> > > javascript?
> > > In questo esempio il text node 'testo' viene
> > > aggiunto sempre all'ultimo degli
> > > span.
> >
> > Io comunque ti consiglio, dato che lo standard
> > dice che in javascript i binding esistono tutti
> > al livello di funzione, di considerare che un
> > semplice blocco non introduce un nuovo binding
> > frame, di conseguenza tutte le funzioni anonime
> > che stai creando sono chiuse sulla stessa
> > variabile.
>
>
Mi è caduto sul bagagliaio e ho detto, perchè no!
-
-
Re: [JS] lich eiutoScritto daNon Autenticatoil 2010-09-14 20:00:00.0 alle 2010-09-14 20:00:00.0
- Scritto da: Avve TheFail
>
> - Scritto da: suoranciata
> > http://pastebin.com/p8vdukUf
> >
> > E' un bug il fatto che (almeno in firefoz)
> > all'interno della funzione anonima la reference
> > di span viene risolta sempre con l'ultima del
> > ciclo oppure mi sfugge qualcosa sullo scoping
> > delle var in
> > javascript?
> > In questo esempio il text node 'testo' viene
> > aggiunto sempre all'ultimo degli
> > span.
>
> Io comunque ti consiglio, dato che lo standard
> dice che in javascript i binding esistono tutti
> al livello di funzione, di considerare che un
> semplice blocco non introduce un nuovo binding
> frame, di conseguenza tutte le funzioni anonime
> che stai creando sono chiuse sulla stessa
> variabile.
l ' ho capita ora !


-
-