Arrow functions, le funzioni compatte di JS

La versione EICMA del 2015 introduce in JS molte novità (lo accennavamo qui), non solo a livello di funzionalità e prestazioni ma anche di notazione. Avere notazioni più concise aiuta i programmatori a risparmiare tempo, ma anche righe di codice che in un linguaggio di scripting si traducono in file .js meno pesanti a parità di funzionalità. Non è di certo una novità questo approccio: Kotlin (il fratellino minore di Java), Python e C#, che sono linguaggi anagraficamente più giovani, hanno qualcosa di simile detto funzioni lambda, dalla prima versione.

Come si usano

Partiamo dall’esempio più didattico di sempre. Tutti gli studenti imparano a dichiarare le funzioni del tipo:

function somma(a, b) 
{
  return a+b;
}

console.log(somma(4,2)) //6

parametri a e b, una dicitura return, una dicitura function, parentesi graffe a racchiudere. Tutto corretto e funzionante! MA se volessi rendere implicite le diciture function, return e le parentesi? Lo standard citato ci indica questa forma:

let somma = (a,b) => a+b;

console.log(somma(4,2))

Siamo passati dalle 4 righe del primo esempio di funzione ad 1 sola riga. Compare il simbolo “freccia” che qualcuno ricorda dai vettori associativi del PHP mentre qui serve quasi ad indicare “questi parametri di sinistra buttali nel codice dì destra.”

Addirittura, se nella funzione il parametro fosse singolo, non avremmo neanche bisogno delle parentesi tonde:

let dimezza = n => n / 2;

console.log(dimezza(8))   //4

E’ obbligatorio usare questa dicitura? No, ma nel mondo professionale è sempre più raro imbattersi in frammenti di codice più recente in forma tradizionale. Vale la pena quindi almeno conoscere la dicitura per non farsi trovare impreparati.

Posso usarla a prescindere? Il lettore più attento e curioso avrà già la risposta. No, per usare una funzione arrow dobbiamo avere una situazione in cui l’espressione è sintetizzabile con un solo semplice calcolo di una sola riga. Andare a capo in una espressione equivale ad un errore sanzionato a runtime.

let nomefunzione = (parametro/i) => espressione

Manca il caso senza parametri, qui forse meno intuitivo, in cui è preferibile usare le parentesi anche se vuote

let stampa = () => 50/2;

Ok, ci prendi in giro, mica posso ridurre tutto all’uso di espressioni più o meno semplici! Infatti nessuno vieta di usare questa modalità facendo seguire un vero e proprio statement con graffe che permette di andare a capo e scrivere codice più complesso e usare la parola riservata return.

let fattoriale = n => 
  {
    let prodotto = 1;
    while(n>0)
      {
        prodotto *=n;
        n--;
      }  
    return prodotto;
  }

console.log(fattoriale(8))  //40320

Espressioni si, statements no

La regola per usare le le arrow function sono poche, le occasioni per usarle in realtà potrebbero non essere tantissime. Il vincolo di dover usare espressioni snelle monorigo in molti casi potrebbe essere proibitivo e qui rimane giusto usare uno statement complesso, un calcolo complesso con variabili, operazioni ed assegnazioni diverse. Le espressioni producono un valore da ritornare, gli statement contengono in generale una serie di azioni più complesse. In quest’ultimo caso, si perde la snellezza della forma a freccia, ma nessuno vieta di utilizzarla sempre e comunque abituandosi ad essa in ogni circostanza. Più complesso, meno intuitivo, e in alcuni casi passibile di errore, è usare le arrow functions con gli oggetti/classi della OOP. Lasciamo ad altri articoli questo dettaglio.

Potete provare gli esempi su replit.it, linguaggio Node.js => qui

Ultima modifica 12 Novembre 2022