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
/bind
impostanothis
manualmente. - Arrow function: non ha
this
proprio; 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: bind
let 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.