Mostra notizie nelle discussioni
  • Avatar
    ☺
    Scritto da
    il 2010-09-14 09:13:00.0 alle 2010-09-14 09:13:00.0
    Trollate totali: 2013
    [JS] lich eiuto
    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.
    • Avatar
      ☺
      Scritto da
      il 2010-09-14 09:46:00.0 alle 2010-09-14 09:46:00.0
      Trollate totali: 42885
      Re: [JS] lich eiuto
      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.
      `"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo
      • Avatar
        Scritto da
        Non Autenticato
        il 2010-09-14 10:20:00.0 alle 2010-09-14 10:20:00.0
        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.
        >
        > 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.

        Immagine postata dall'utente
      • Avatar
        ☺
        Scritto da
        il 2010-09-14 10:46:00.0 alle 2010-09-14 10:46:00.0
        Trollate totali: 5425
        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ì.
        • Avatar
          ☺
          Scritto da
          il 2010-09-14 12:04:00.0 alle 2010-09-14 12:04:00.0
          Trollate totali: 42885
          Re: [JS] lich eiuto

          - Scritto da: Rin Kobayashi

          > Javascript non crea ad ogni assegnazione (ad ogni
          > ciclo) una nuova variabile i

          D'oh Deluso !

          Ma qvesto ezzere perkolozizzimo Deluso !!

          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 Sorride !
          `"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo
        • Avatar
          ☺
          Scritto da
          il 2010-09-14 12:23:00.0 alle 2010-09-14 12:23:00.0
          Trollate totali: 3444
          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. Anonimo
          • Avatar
            Scritto da
            Non Autenticato
            il 2010-09-14 12:25:00.0 alle 2010-09-14 12:25:00.0
            Re: [JS] lich eiuto
            - 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.
            > Anonimo

            si chiamano closures, è una tecnica normalissima e molto utile, e non ce l'ha solo javascript ma ogni linguaggio che supporta le funzioni anonime.
    • Avatar
      ☺
      Scritto da
      avvelentani
      Cubicolario
      il 2010-09-14 16:53:00.0 alle 2010-09-14 16:53:00.0
      Trollate totali: 18184
      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.

      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
      • Avatar
        Scritto da
        Non Autenticato
        il 2010-09-14 17:13:00.0 alle 2010-09-14 17:13:00.0
        Re: [JS] lich eiuto

        - 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! Arrabbiato
    • Avatar
      ☺
      Scritto da
      il 2010-09-14 18:20:00.0 alle 2010-09-14 18:20:00.0
      Trollate totali: 160
      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.
      • Avatar
        ☺
        Scritto da
        il 2010-09-14 18:53:00.0 alle 2010-09-14 18:53:00.0
        Trollate totali: 3444
        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`! In lacrime
        • Avatar
          ☺
          Scritto da
          il 2010-09-14 20:01:00.0 alle 2010-09-14 20:01:00.0
          Trollate totali: 160
          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`!
          > In lacrime

          Vuoi un consiglio? Ne ho tanti da dare! Ficoso
      • Avatar
        ☺
        Scritto da
        avvelentani
        Cubicolario
        il 2010-09-14 19:16:00.0 alle 2010-09-14 19:16:00.0
        Trollate totali: 18184
        Re: [JS] lich eiuto

        - 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.

        Arrabbiato
        I think happiness is love
        - Vladimir Putin
        • Avatar
          ☺
          Scritto da
          il 2010-09-14 20:02:00.0 alle 2010-09-14 20:02:00.0
          Trollate totali: 160
          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.
          >
          > Arrabbiato

          Mi è caduto sul bagagliaio e ho detto, perchè no! Triste
      • Avatar
        Scritto da
        Non Autenticato
        il 2010-09-14 20:00:00.0 alle 2010-09-14 20:00:00.0
        Re: [JS] lich eiuto

        - 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 ! Rotola dal ridereRotola dal ridereRotola dal ridereRotola dal ridere
<softv>

Pagina generata in 253 millisecondi

Utenti attivi: 11 nell'ultimo minuto, 46 negli ultimi cinque minuti, 79 negli ultimi 15 minuti