Ritorno
Tech 3 min di lettura - 4 gen. 23 - Mayeul Le Monies de Sagazan

Funzione freccia vs funzione tradizionale in JavaScript

Se in JavaScript ti sei già chiesto quando usare le funzioni freccia e quando usare le funzioni tradizionali, o più semplicemente qual è la differenza tra le due opzioni, sei nel posto giusto!
Note :
  • quando parlerò di una funzione tradizionale, parlerò di una funzione dichiarata con la parola chiave 'function'
  • una funzione freccia (ou arrow function en anglais) è una funzione dichiarata con la sintassi compatta () => {}

Parte 1 : This

La prima differenza tra le due opzioni è la gestione di "this", infatti le funzioni freccia conservano il "this" del contesto in cui la funzione è stata chiamata, il che non è necessariamente il caso di una funzione tradizionale. Ecco un esempio per illustrare: language=js class MyClass { prop = "hehe"; testArrow() { const f = () => { console.log(this.prop); }; f(); } testFunction() { function f() { console.log(this.prop); } f(); } } const instance = new MyClass();
Quando si farà la chiamata a : instance.testArrow() non ci sarà errore perché il this dell'istanza della classe è conservato, invece se si prova : instance.testFunction() Ci sarà un bell'errore JavaScript "Cannot read properties of undefined" ...
Per capire questo errore, bisogna saperne un po' di più sulla parola chiave this e su JavaScript in generale :
  • in una funzione tradizionale "this" corrisponde all'oggetto globale
  • in una funzione tradizionale E in modalità stretta ("use strict";) "this" sarà undefined
  • il corpo di una classe è sempre eseguito in modalità stretta
Ora, nel nostro caso, la funzione è dichiarata in una classe, quindi in modalità stretta, quindi "this" sarà undefined, da cui il nostro errore JavaScript "Cannot read properties of undefined".

Bonus :

Se si sostituisce il nostro metodo "testFunction" nella classe "MyClass" con il seguente codice :
testFunctionBinded() {
  function f() {
    console.log(this.prop);
  }
  f.bind(this)();
}
Questo metodo è identico, ad eccezione della chiamata a f().
Infatti, chiamando f e collegandola manualmente al corretto "this" con la seguente sintassi : f.bind(this)(); Non si avrà errore durante la chiamata a instance.testFunctionBinded()

Parte 2 : JavaScript Hoisting

In JavaScript, quando si usa la parola chiave "function", si può usare questa funzione prima della sua dichiarazione (purché si rimanga nello stesso blocco), questo è ciò che chiamiamo il hoisting.
In alcuni casi è abbastanza piacevole, ma spesso porta a errori difficili da debuggare, ad esempio :
if (true) {
  function a() {
    console.log("1");
  }

  if (true) {
    a(); // affiche "2"

    // on pourrait imaginer faire plein de choses dans la fonction
    // et puis oublier qu'il y a déjà une fonction "a" et en déclarer une autre avec le mot clé function
    function a() {
      console.log("2");
    }
  }
}
Qui, si dichiara una prima funzione "a", poi nel blocco successivo, all'inizio del blocco si chiama a() e alla fine del blocco si dichiara un'altra funzione "a". Durante la chiamata a a(), non è la funzione che si pensava a essere chiamata poiché la seconda funzione "a" è "hoisted"...
Spesso si mantengono le funzioni freccia in un "const" o un "let", il che permette di avere una lettura del codice molto più facile perché leggibile dall'alto verso il basso e quindi di eliminare il bug visto sopra.
Ecco fatto! Personalmente, preferisco usare le funzioni freccia, perché il comportamento è molto più facile da prevedere e il codice più facile da leggere!

Desideri essere accompagnato per lanciare il tuo progetto digitale ?

Invia il tuo progetto ora