javascript closure = c # proprietà?

6

Per chiunque sia esperto in Javascript e in C #:

Possiamo pensare alle chiusure di JS come pensiamo alle proprietà private e pubbliche in c #?

Una chiusura si riferisce a una funzione interna (proprietà pubblica) che ha accesso alle variabili della funzione genitrice (campi privati), anche quando la chiamata alla funzione Genitore è completata.

Senza la funzione interna, l'ambito della variabile nella funzione genitore cessa una volta che la funzione genitore è stata eseguita. Pertanto, sembra che un modo per accedere alle variabili "private" della funzione genitore sia tramite la funzione interna "pubblica" che mantiene l'accesso alle variabili "private" della funzione genitore.

Questo suona giusto per un C # che cerca di dare un senso alle chiusure di Javascript?

    
posta nanonerd 01.08.2016 - 06:05
fonte

4 risposte

18

Stai mescolando cose diverse qui, probabilmente perché hai visto esempi su come le chiusure possono essere usate per simulare il concetto di campi pubblici e privati in una lingua che non ha questo tipo di modificatori di accesso.

Tuttavia, il concetto di chiusure - funzioni legate insieme a un "ambito interno" - è molto più generale. È disponibile anche in Javascript, C # e in altre lingue. Il suo scopo principale è non di fornire qualcosa come "proprietà private o pubbliche" - questa è solo una possibile applicazione di una chiusura. Questo articolo di Wikipedia ha una sezione "Applicazioni" che contiene un elenco di altri possibili usi del concetto.

    
risposta data 01.08.2016 - 07:47
fonte
9

C # ha anche chiusure. Un esempio:

class A {
 Func<int, int> CreateClosure() {
    int a = 17;
    return x => x + a;
 }
}

Il metodo restituisce una chiusura (la funzione x => x + a ), che cattura la variabile locale a .

Le chiusure non hanno nulla a che fare con le proprietà in particolare, ma le chiusure possono essere usate come un modo per fornire un accesso controllato alle variabili. In effetti, gli oggetti possono essere emulati usando chiusure.

    
risposta data 01.08.2016 - 08:19
fonte
3

Spero davvero che chi scrive nel blog smetta di promulgare l'aspetto della privacy delle chiusure. È un uso debole di loro e non vale la pena menzionarlo. Quello che vale la pena sapere su di loro è l'aspetto comunicazione , senza dover creare in modo esplicito una struttura dati per contenere le informazioni che si desidera comunicare. Si consideri il seguente esempio di ECMAScript 6:

function bestSellingBooks(threshold) {
  return bookList.filter(book => book.sales >= threshold);
}

Qui una chiusura viene utilizzata come predicato della funzione filter per comunicare in modo succinto un valore threshold . Non pensiamo a threshold come valore privato di qualche altra entità. Non vogliamo pensare a threshold come valore privato di qualche altra entità, e questo è esattamente il punto.

Le chiusure sono più potenti e più spesso utilizzate quando si desidera comunicare un valore senza dover costruire una struttura di supporto per identificarlo e mantenerlo. Prova ad implementare il predicato filter sopra senza usare chiusure e vedrai quanto rigmarole evita. I migliori esempi di chiusura sono quelli che a malapena si notano.

    
risposta data 01.08.2016 - 19:31
fonte
2

No. Se si desidera confrontare con C #, una migliore analogia è costituita dai parametri del costruttore.

Diciamo che un API richiede di fornirlo con una callback senza argomenti.

In OO tipicamente costruisci un oggetto con tutto ciò che deve sapere fornito nel costruttore. Ora puoi implementare i metodi no-args.

Nella programmazione funzionale questo viene tipicamente fatto usando chiusure in cui una funzione può usare variabili da ambiti esterni e quindi implementare il requisito di assenza di argomenti.

    
risposta data 01.08.2016 - 08:12
fonte

Leggi altre domande sui tag