this
In JavaScript, this è una parola chiave fondamentale che rappresenta il contesto di esecuzione corrente. Il suo valore non è fisso, ma dipende da come e dove una funzione viene invocata, non da dove è definita. Questo è uno degli aspetti più importanti (e spesso fraintesi) del linguaggio.
Comprendere this è essenziale per lavorare correttamente con oggetti, metodi, classi, funzioni e callback.
Concetto generale
this fa riferimento a un oggetto. In particolare, rappresenta l’oggetto che sta eseguendo il codice in quel momento.
this.nome;Il valore di this cambia in base al contesto di chiamata (calling context).
this nel contesto globale
Nel contesto globale:
- Nel browser,
thisfa riferimento all’oggettowindow - In Node.js,
thisfa riferimento aglobal(o a un oggetto vuoto nei moduli)
console.log(this); // window (nel browser)Attenzione: Con "use strict" il comportamento cambia:
"use strict";
console.log(this); // undefinedthis all’interno di un oggetto
Quando una funzione è invocata come metodo di un oggetto, this fa riferimento all’oggetto stesso.
const utente = {
nome: "Mario",
saluta() {
console.log(this.nome);
},
};
utente.saluta(); // MarioQui:
salutaè chiamato tramiteutentethis→utente
this e funzioni normali
Una funzione non associata a un oggetto perde il contesto.
function mostraThis() {
console.log(this);
}
mostraThis(); // window o undefined (strict mode)Se la funzione viene assegnata a una variabile, il contesto non è più l’oggetto originale:
const utente = {
nome: "Mario",
saluta() {
console.log(this.nome);
},
};
const fn = utente.saluta;
fn(); // undefinedIl riferimento all’oggetto viene perso.
this nelle arrow function
Le arrow function non hanno un proprio this. Ereditano il this dal contesto esterno (lexical this).
const utente = {
nome: "Mario",
saluta: () => {
console.log(this.nome);
},
};
utente.saluta(); // undefinedIn questo caso:
thisnon èutentethisè quello del contesto esterno (global scope)
Uso corretto delle arrow function:
const utente = {
nome: "Mario",
saluta() {
const stampa = () => {
console.log(this.nome);
};
stampa();
},
};
utente.saluta(); // Mariothis nei costruttori e nelle classi
Quando una funzione viene usata come costruttore con new, this fa riferimento alla nuova istanza creata.
function Utente(nome) {
this.nome = nome;
}
const u = new Utente("Mario");
console.log(u.nome); // MarioCon le classi:
class Utente {
constructor(nome) {
this.nome = nome;
}
saluta() {
console.log(this.nome);
}
}
const u = new Utente("Mario");
u.saluta(); // Mariothis nei callback
Nei callback, this può cambiare contesto in modo inatteso.
const utente = {
nome: "Mario",
saluta() {
setTimeout(function () {
console.log(this.nome);
}, 1000);
},
};
utente.saluta(); // undefinedSoluzioni comuni:
Arrow function
setTimeout(() => {
console.log(this.nome);
}, 1000);Salvataggio del contesto
const self = this;
setTimeout(function () {
console.log(self.nome);
}, 1000);Forzare il valore di this: call, apply, bind
JavaScript mette a disposizione metodi per impostare manualmente this.
call
function saluta() {
console.log(this.nome);
}
saluta.call({ nome: "Mario" }); // Marioapply
Simile a call, ma accetta argomenti come array.
saluta.apply({ nome: "Luigi" });bind
Restituisce una nuova funzione con this fissato.
const salutaMario = saluta.bind({ nome: "Mario" });
salutaMario(); // MarioRegole fondamentali da ricordare
thisdipende da come una funzione viene chiamata- I metodi di un oggetto hanno
thisriferito all’oggetto - Le arrow function non hanno
thisproprio newcrea un nuovothiscall,applyebindpermettono di controllarethis- In strict mode,
thispuò essereundefined
Conclusione
this è uno dei concetti più potenti e delicati di JavaScript. Una comprensione solida del suo funzionamento permette di scrivere codice più prevedibile, manutenibile e robusto, soprattutto quando si lavora con oggetti complessi, classi, callback e architetture avanzate.
Padroneggiare this significa padroneggiare il contesto di esecuzione del linguaggio.