JavaScript: this, call, apply, bind
this, call, apply, bind
Vediamo come funziona this in JavaScript e come controllarlo con call, apply e bind. Analizziamo i principali casi: chiamata come metodo, funzione semplice, costruttore con new e binding esplicito.
Introduzione a this
In JavaScript, this è una parola speciale che cambia significato a seconda di come una funzione viene chiamata.
Non indica la funzione stessa, ma l'oggetto di riferimento legato all’esecuzione in quel momento.
Questo significa che la stessa funzione può avere valori diversi di this se invocata in contesti differenti.
Possiamo quindi dire che this rappresenta “chi” sta invocando la funzione: un oggetto, un elemento HTML, una nuova istanza, oppure può essere undefined.
Regole base:
- Metodo di oggetto:
thisè l'oggetto prima del punto. - Funzione semplice: in strict mode è
undefined; altrimenti èwindow(ambiente browser). - Costruttore con new:
thisè la nuova istanza creata. - Binding esplicito:
call/apply/bindimpostanothismanualmente. - Arrow function: non ha
thisproprio; eredita quello lessicale esterno.
this in un metodo
Quando una funzione è chiamata come proprietà di un oggetto, this punta a quell’oggetto.
Codice Esempio: this come metodo
"use strict";
let user = {
nome: "Ada",
saluta: function() {
console.log("Ciao " + this.nome); // this -> user
}};
user.saluta(); // stampa: Ciao Ada
this in funzione semplice
In strict mode, chiamando una funzione senza oggetto, this è undefined.
Codice Esempio: funzione semplice e strict mode
"use strict";
function mostraThis() {
console.log(this); // undefined in strict mode
}mostraThis();
this con new (costruttore)
Con new, la funzione costruttrice riceve come this il nuovo oggetto creato.
Codice Esempio: costruttore con new
function Persona(nome) {
this.nome = nome; // this -> nuova istanza
}let p = new Persona("Luca");
console.log(p.nome); // Luca
Binding esplicito con call e apply
call e apply invocano subito la funzione impostando this.
Differiscono nel passaggio degli argomenti: separati con call, in array con apply.
Codice Esempio: call vs apply
function info(citta, anno) {
console.log(this.nome + " - " + citta + " - " + anno);
}let user = { nome: "Ada" };
info.call(user, "Milano", 1981); // Ada - Milano - 1981
info.apply(user, ["Roma", 1980]); // Ada - Roma - 1980
Binding permanente con bind
bind non invoca la funzione subito. Restituisce una nuova funzione con this fissato e, volendo, argomenti predefiniti.
Codice Esempio: bind e perdita di this
let counter = {
val: 0,
inc: function() { this.val++; }
};
// perdita di this se passo il metodo diretto:let f = counter.inc;
// f(); // in strict: this = undefined, errore// soluzione: bindlet incSafe = counter.inc.bind(counter);
incSafe();
console.log(counter.val); // 1
this in un gestore di eventi HTML
Quando una funzione è usata come gestore di eventi in un elemento HTML, this fa riferimento all’elemento stesso che ha ricevuto l’evento.
Codice Esempio: this si riferisce all'elemento
Un approccio alternativo è passare direttamente l’elemento come parametro. In questo caso la funzione userà l’argomento ricevuto invece di this.
Codice Esempio: passaggio esplicito dell'elemento
Tabella riassuntiva
| Contesto | Valore di this | Esempio |
|---|---|---|
| Metodo di oggetto | L'oggetto che precede il punto | obj.metodo() |
| Funzione semplice (strict) | undefined | fn() |
| Costruttore | Nuova istanza creata | new Fn() |
| call(obj, a, b) | this = obj, argomenti separati | fn.call(obj, 1, 2) |
| apply(obj, [a,b]) | this = obj, argomenti in array | fn.apply(obj, [1, 2]) |
| bind(obj) | Ritorna una nuova funzione con this = obj | let g = fn.bind(obj) |
| Arrow function | Eredita this dal contesto esterno | () => this |
Considerazioni
call e apply servono quando si vuole invocare subito la funzione con un this specifico. bind è essenziale per passare metodi come callback senza perdere il contesto. Le arrow function ereditano this e sono utili nei callback annidati.

IP: 216.73.216.214