Perché passare grandi funzioni anonime come argomenti ad altre funzioni così ampiamente accettate in JavaScript?

25

Ho un parere (che sono sicuro sarà condiviso da alcuni) che passa le funzioni anonime che contengono più di poche righe di codice, come argomenti ad altre funzioni che influenzano la leggibilità e l'auto-documentazione drasticamente, al punto in cui ritengo che sarebbe molto meglio per chiunque, probabilmente, utilizzare il codice per dichiarare semplicemente una funzione con nome. O almeno assegnare quella funzione anonima a una variabile prima di dichiarare la funzione principale

Tuttavia, molte librerie JavaScript (jQuery, d3.js / NVD3.js) solo per dare un paio di esempi, usano grandi funzioni in questo modo.

Perché è così ampiamente accettato in JavaScript? È una cosa culturale, o ci sono dei vantaggi che mi mancano, il che renderebbe l'uso più preferito del dichiarare una funzione con nome?

    
posta Adam Copley 26.02.2016 - 19:19
fonte

2 risposte

21

Tre ragioni principali a cui posso pensare:

  1. Accesso ambito genitore
  2. Privacy
  3. Riduzione dei nomi definiti negli ambiti superiori

Accesso ambito genitore: le definizioni di funzioni in linea consentono al codice in linea di accedere alle variabili definite negli ambiti padre. Questo può essere molto utile per molte cose e può ridurre la quantità o la complessità del codice se fatto correttamente.

Se inserisci il codice in una funzione definita al di fuori di questo ambito e quindi chiami il codice, dovrai passare qualsiasi stato genitore a cui desidera accedere alla funzione.

Privacy: il codice all'interno di una definizione anonima incorporata è più privato e non può essere chiamato da altro codice.

Riduzione dei nomi definiti negli ambiti superiori: Questo è il più importante quando si opera nell'ambito globale, ma una dichiarazione anonima in linea evita di dover definire un nuovo simbolo nell'ambito corrente. Dal momento che Javascript non richiede in modo nativo l'uso di spazi dei nomi, è consigliabile evitare di definire altri simboli globali rispetto a quelli minimi richiesti.

Editoriale: Sembra che sia diventato una cosa culturale in Javascript dove dichiarare qualcosa di anonimo in linea è in qualche modo considerato "migliore" della definizione di una funzione e chiamarla anche quando l'accesso all'ambito genitore non viene utilizzato. Sospetto che ciò sia stato inizialmente dovuto al problema dell'inquinamento globale nello spazio dei nomi in Javascript, forse a causa di problemi di privacy. Ma ora si è trasformato in qualcosa di culturale e puoi vederlo espresso in molti corpi pubblici di codice (come quelli che hai citato).

In linguaggi come il C ++, la maggior parte probabilmente considererebbe una pratica tutt'altro che ideale avere una funzione gigante che si estende su molte pagine / schermate. Ovviamente, C ++ ha un namespacing integrato, non fornisce l'accesso all'ambito genitore e ha caratteristiche di privacy in modo che possa essere motivato interamente dalla leggibilità / manutenibilità, mentre Javascript deve usare l'espressione del codice per raggiungere l'accesso alla privacy e all'ambito genitore. Quindi, JS sembra essere stato motivato in una direzione diversa ed è diventato qualcosa di culturale nella lingua, anche quando le cose che hanno motivato quella direzione non sono necessarie in un caso specifico.

    
risposta data 26.02.2016 - 19:32
fonte
6

Le funzioni anonime sono utilizzate per molti più scopi in JavaScript di quanto lo siano nella maggior parte delle lingue.

In primo luogo, sono usati per namespacing e scope scope. Fino a poco tempo fa JavaScript non disponeva di moduli o altri tipi di meccanismo di namespacing che ha portato all'utilizzo di funzioni anonime per fornire tale funzionalità tramite il modello di modulo. Non ci sarebbe assolutamente alcun vantaggio nel nominare queste funzioni. Su scala ridotta, a causa della mancanza di scope scope di JavaScript fino a poco tempo fa, è stato utilizzato un pattern simile imitare lo scoping del blocco; in particolare nel corpo di anelli. L'utilizzo di una funzione con nome in questo caso sarebbe attivamente offuscante.

In secondo luogo, e meno specifiche di JavaScript, le funzioni anonime vengono spesso utilizzate con funzioni di ordine superiore che imitano le strutture di controllo. Ad esempio, il metodo each di jQuery. Dubito che tu astragga ogni loop body o if-branch in una funzione ogni volta che è lunga più di qualche riga. La stessa logica si applica in questo caso.

Un ultimo motivo è la programmazione basata sugli eventi è comune in JavaScript che tende a portare a uno stile di passaggio di continuazione inavvertitamente codice. Si effettua una chiamata AJAX e si registra una richiamata che, una volta eseguita, effettuerà un'altra chiamata AJAX e registrerà una richiamata ecc. Se le chiamate erano sincrone anziché asincrone, questa sarebbe solo una sequenza di codice in linea retta in un singolo ambito lessicale . Di nuovo, dubito che tu possa astrarre ogni riga di codice lineare in una funzione.

Ci sono anche fattori culturali e, per le ragioni sopra citate, tra le altre, le funzioni anonime sono molto più comuni in JavaScript di molte altre lingue e sono utilizzate in modo più constrongvole / rilassato rispetto a molte altre lingue.

    
risposta data 26.02.2016 - 20:14
fonte

Leggi altre domande sui tag