Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    412

    Un modo mai visto di inizializzare un listener

    Salve, cercando su internet un esempio di implementazione dell'API google maps mi sono imbattuto in questo codice

    google.maps.event.addListener(marker, 'click', (function(marker, i) {
    return function() {
    infoWindow.setContent(infoWindowContent[i][0]);
    infoWindow.open(map, marker);
    }
    })(marker, i));
    se togliamo il corpo della funzione che crea casino, si può notare come la dichiarazione sia fatta in questo modo
    google.maps.event.addListener(marker, 'click', (function() {} ) (marker, i) );
    Sono due cose che non riesco a capire: 1) che senso hanno questi parametri racchiusi tra parentesi tonde?
    2) perchè tra function e (marker, i) non c'è nessuna virgola?


    Questo il sito dove ho trovato il codice (che cmq funziona quindi è semanticamente esatto)
    http://wrightshq.com/playground/plac...p-using-api-3/
    Ultima modifica di American; 12-11-2013 a 14:40

  2. #2
    si chiamano "self-executing anonimous function"

    come vedi la funzione accetta 2 argomenti, marker e i, (function(marker, i){})(marker, i) <---- questo passa marker e i alla funzione anonima
    Questa volta, più che un voto.. è favoreggiamento.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    412
    Scusa, marker e i non vengono già passati nella parte che ho evidenziato in blu?

    (function(marker, i){})(marker, i)

  4. #4


    e invece si

    il costrutto delle self-executing function è:
    codice:
    (function() { })()
    se vuoi passare dei parametri
    codice:
    (function(par) { })(par)
    Questa volta, più che un voto.. è favoreggiamento.

  5. #5
    lo stack di inizializzazione delle funzioni per il listener che hai postato è un po' complesso da capire, forse è quello che ti frega:

    questo
    codice:
    google.maps.event.addListener(marker, 'click', (function anonimousF(marker, i) {
                return function Closure() {
                    infoWindow.setContent(infoWindowContent[i][0]);
                    infoWindow.open(map, marker);
                }
            })(marker, i));
    genera:
    codice:
    // settaggio variabili
    var marker = google.maps.Marker;
    var i = contatore;
    
    // la self-executing function si carica prima di qualsiasi cosa
    anonimousF(marker, i);
    
    // al completamento dell'onload della pagina
    
    // setto l'evento click alla mappa una volta caricato il DOM
    google.maps.event.addListener(marker, 'click', function Closure() {
                    infoWindow.setContent(infoWindowContent[i][0]);
                    infoWindow.open(map, marker);
                } );
    
    //quando l'utente clicca richiama
    Closure();
    solo per capire i passaggi
    Questa volta, più che un voto.. è favoreggiamento.

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    412
    Grazie per la spiegazione, ma continuo a ritenerlo un discreto casino

    Per fare un po' di chiarezza, la sintassi per la self exec func è propria del linguaggio? Cioè, così come si dichiarano funzioni scrivendo function qwerty(){} così si dichiarano self exec func scrivendo (function(par) { })(par) ?

  7. #7
    Immagino che il listener sia definito in un ciclo for, quindi ti serve creare una clousure per racchiudere il valore di i, altrimenti il contenuto della info Window sarà sempre quello corrispondente all'ultimo valore di i indipendentemente da che marker cliccki.
    max

    Silence is better than bullshit.
    @mmarcon
    jHERE, Maps made easy

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    412
    Quote Originariamente inviata da mxa Visualizza il messaggio
    Immagino che il listener sia definito in un ciclo for, quindi ti serve creare una clousure per racchiudere il valore di i, altrimenti il contenuto della info Window sarà sempre quello corrispondente all'ultimo valore di i indipendentemente da che marker cliccki.
    esattamente, infatti facendo alcune prove è proprio così.
    Quello che mi chiedo tuttavia è, questo modo di inizializzare la funzione per generare la clousure
    (function(par) { })(par)

    è stata creata appositamente dagli ingegneri javascript, oppure è un semplice escamotage ricavato su quel già di buono offrono i metodi standard del linguaggio?

    Ho creato un codice più semplice da capire

    Codice PHP:
    <div id="uno">uno</div>
    <
    div id="due">due</div>
    <
    div id="tre">tre</div>

    <
    script>

    function 
    prova(a)
    {
    alert(a)}

    for (var 
    i=1i<4i++)
    {
      if (
    i==1)
      {
         $(
    '#uno').bind("click", function(){prova(i)} ) //restituisce 4 che è il valore che la variabile globale i ha assunto alla fine del ciclo
      
    }
      else if (
    i==2)
      {
          $(
    '#due').bind("click", function(i){return function(){prova(i)}}(i) ) //restituisce correttamente 2 in quanto genero una clousure con la variabile i
      
    }
       else if (
    i==3)
      {
          $(
    '#tre').bind("click", function(i){return function(){prova(i)}}(i) ) //restituisce correttamente 3 in quanto genero una clousure con la variabile i
      
    }
    }

    </script> 
    Ora a ben vedere function(i){return function(){prova(i)}}(i) potrebbe essere visto in questo modo:
    la prima function anonima genera (ritorna) un'ulteriore function anonima, seguita poi da ulteriori parentesi tonde con incluso un argomento.
    ciò che ne risulta a conti fatti è la dichiarazione di una funzione
    function(i) {prova(i)}

    Se così fosse, è appunto questo che intendo per escamtoage
    Ultima modifica di American; 13-11-2013 a 08:32

  9. #9
    http://www.crockford.com/javascript/private.html prova a vedere se questo ti aiuta...

    Non parla delle self-executing ma chiarisce alcuni concetti basilari sulle funzioni.

    Il costrutto
    codice:
    ( function() { } )()
    non è un workaround, è un costrutto che permette di inizializzare la funzione (in questo caso anonima) prima di qualsiasi altra cosa..
    Ultima modifica di Al_katraz984; 13-11-2013 a 11:06
    Questa volta, più che un voto.. è favoreggiamento.

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    412
    Ok quindi è un costrutto insito del linguaggio
    ma non potevano fare in modo che avesse una sintassi del genere

    ( function(params) { } )
    anziché
    ( function() { } )(params)

    ??

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.