Funzioni di ordine elevato: qual è il vantaggio che restituisce una funzione rispetto a un valore?

1

Nelle parole dell'ordine, qual è il vantaggio di scrivere questo:

Elenco 1

var sortBy = function sortBy(p) {
  return function (a, b) {
    return a[p] > b[p];
  };
};

Rispetto a questo?

Elenco 2

var sortBy = function sortBy(p, a, b) {
  return a[p] > b[p];
};

Riferimento .

    
posta alex 15.06.2017 - 03:59
fonte

2 risposte

6

Nel primo elenco è possibile applicare parzialmente sortBy , nel secondo non è possibile. Il vantaggio dell'applicazione parziale di questa funzione è che è possibile disaccoppiare la dipendenza della chiave da ordinare in base agli usi della funzione di ordinamento. Vedi questa domanda per una descrizione più completa dei vantaggi del curriculum .

Ad esempio:

const sortByName = sortBy("name")
const a = { name: "aaron" }
const b = { name: "billy" }
const c = { name: "charlie" }
sortByName(a, b) // true
sortByName(b, c) // true

Questo è utile se hai bisogno di una funzione binaria. Ad esempio Array.prototype.sort() prende un binario funzione come argomento. Potresti fare qualcosa di simile (se la tua funzione di ordinamento è stata implementata in base alle specifiche):

[a, b, c].sort(sortByName)

ma con l'elenco 2 dovresti fare qualcosa del tipo:

[a, b, c].sort((left, right) => sortBy("name", left, right))
    
risposta data 15.06.2017 - 04:52
fonte
1

Bene, ora stai facendo due diverse domande.

What's the benefit returning a function compared to a value? Functions can do things. Values just sit there being things. Unless of course the value is a function.

Con l'elenco 1 puoi dire sortBy(0)(x, y) con l'elenco 2 devi dire sortBy(0, x, y)

Le cose si divertono con l'elenco 1 quando dici s = sortBy(0) perché ora puoi dire s(x,y) o s(y,z) . Viene ricordato lo 0, quindi non devi passarlo quando chiami s . Ciò significa che è possibile conoscere questi valori in momenti diversi. Non devi spingerli tutti in una volta.

Ciò che hai ottenuto nella lista 1 è una piccola cosa chiamata chiusura . È quasi la stessa cosa di un oggetto. La prima chiamata si comporta come un costruttore. Il secondo è la chiamata è come una chiamata al metodo. La differenza è che le chiusure hanno solo un metodo. Quindi non devi sapere il suo nome. Dagli un nome e butta un altro () dopo di esso.

Naturalmente le persone funzionali odiano sentirli chiamare metodi. Non è un metodo è una chiusura che "ha accesso al suo ambito lessicale che racchiude". Feh, è un modo elegante per dire che i vars al di fuori della funzione interna allo stesso modo in cui un metodo ha accesso ai membri vars dei membri. In questo caso è il p che è stato passato.

A differenza degli oggetti, puoi decidere quale metodo viene chiamato, scusa, chiudi.

    
risposta data 15.06.2017 - 04:58
fonte

Leggi altre domande sui tag