2012-07-16 9 views
8

Ho esaminato tutte le altre (eccellenti) risposte su SO (in particolare questo: How do JavaScript closures work?) ma volevo il tuo feedback sulla mia comprensione del concetto.Si tratta di un caso valido per la chiusura di javascript?

Capisco che un caso d'uso è quello di nascondere l'implementazione dei metodi privati ​​dall'accesso pubblico.

L'altro che ci penso sta avendo come un generatore di fabbrica:

<script> 

function carFactory(make) { 

    var m = make; 
    return { manufacture: function (model) 

     {console.log("A " + m + " " + model + " has been created");} 

    } 
} 

toyotaFactory = carFactory("toyota"); 
hondaFactory = carFactory("honda"); 

toyotaFactory.manufacture("corolla"); 
toyotaFactory.manufacture("corolla"); 
hondaFactory.manufacture("civic"); 

</script> 

Questo uscite:

A toyota corolla has been create 
A toyota corolla has been created 
A honda civic has been created 

Quindi pensi che il suo un caso d'uso valida per le chiusure (vale a dire la creazione di più fabbriche che utilizzano lo stesso codice base)? Oppure posso ottenere la stessa cosa usando qualcosa di molto meglio?

Si prega di notare che la domanda riguarda meno l'implementazione tecnica delle chiusure e altro su casi d'uso validi nella progettazione/sviluppo di applicazioni.

Grazie.

+0

Mi sembra ok. – Almo

+0

Sembra buono! Non vedo nulla di sbagliato in questo. – Linuxios

+3

Tecnicamente, non hai bisogno di 'm' - puoi semplicemente usare' make' direttamente. – josh3736

risposta

0

chiusure sono estremamente potenti costrutto, con un sacco di usi utili. Quello che hai usato lì è in realtà una sorta di "hack". L'uso più comune delle chiusure è quando hai implementato alcune funzionalità che "fa qualcosa" nel mezzo ... E che "fa qualcosa" può essere configurato più o meno come vuoi ... Ad esempio la funzionalità jQuery ajax può "fare qualcosa" quando la richiesta ha un errore, o quando ha successo, ecc ... Se non avevi le chiusure, saresti in grado di passare solo una funzione "staticamente definita", che probabilmente avrà bisogno di raccogli il contesto necessario per fare tutto ciò che vuoi che faccia da variabili globali, o dovrai usare la stessa firma per tutte le funzioni come quello che è fatto in C o C++ come funzione (customData) {} ... Chiusure consente a "creare dinamicamente funzioni" in fase di runtime, inserendo il contesto che hanno quando sono state create, così puoi passare ai moduli che devono "fare qualcosa" quasi tutto ciò che vuoi, in un modo davvero semplice (in accordo con cosa faresti in c o C++ o senza closu res, che è brutto, incline agli errori e anche un hack).

Così ogni volta che è necessario "configurare" alcune funzionalità personalizzate all'interno qualcosa, si utilizzerà una chiusura ...

1

Se ho la comprensione la sua domanda, non siete interessati a mantenere la make proprietà privata ? Se questo è il caso, quindi una chiusura non è realmente necessario, e si potrebbe ottenere la stessa funzionalità utilizzando un prototipo ...

function carFactory(model){ 
    this.m = make; 
} 

carFactory.prototype.manufacture = function(model){ 
    console.log('A ' + this.m + ' ' + model + ' has been created'); 
} 

Che ha associato benefici delle prestazioni (riduzione della memoria e una maggiore velocità), come da this question .

+1

Memorizza il nome del modello, ma non lo mantiene privato. Le variabili membro sono disponibili a chiunque.Il vantaggio della chiusura dell'OP è che il nome del modello è veramente privato. – jfriend00

+0

sì, ho modificato la mia risposta per essere un po 'più specifica. questa è solo una risposta praticabile se mantenere "make" privato non è necessario. se lo è, però, una chiusura è la soluzione migliore. – market

+1

Ho pensato che l'intero punto della chiusura nella domanda dell'OP fosse la privacy. Sono d'accordo che se la privacy non è necessaria, allora la chiusura è più complicata (e probabilmente peggiore consumo di memoria) del necessario. Se pubblico, una variabile membro è la più semplice. – jfriend00