Function.prototype.bind în JavaScript

Structuri de control și funcții ES5 (toate browserele moderne)

Creează o copie a funcției cu this fixat și, opțional, cu primii parametri completați.

Sintaxă
const nouaFunctie = functie.bind(thisArg, arg1, ...)

Ce face Function.prototype.bind

Spre deosebire de call, bind nu apelează funcția: returnează o funcție nouă, care va avea mereu this egal cu valoarea dată, indiferent cum este apelată mai târziu.

Este necesar când dai o metodă mai departe ca funcție (de exemplu la setTimeout sau addEventListener) și ea își pierde obiectul. Argumentele date după thisArg sunt puse în fața celor de la apel (aplicare parțială).

Parametri

Parametru Descriere
thisArg Valoarea fixă a lui this.
arg1, ... Opțional. Argumente completate dinainte.

Ce returnează

O funcție nouă.

Exemple

Exemplul 1: O metodă care își pierde obiectul

const contor = {
  valoare: 0,
  creste() {
    this.valoare++;
    return this.valoare;
  },
};

const fara = contor.creste;
try {
  fara();
} catch (e) {
  console.log(e.constructor.name);
}

const legat = contor.creste.bind(contor);
legat();
console.log(legat());

Rezultat

TypeError
2

Exemplul 2: Parametri completați dinainte

function inmulteste(a, b) {
  return a * b;
}

const dublu = inmulteste.bind(null, 2);
const triplu = inmulteste.bind(null, 3);
console.log(dublu(21), triplu(5));

Rezultat

42 15

Greșeli frecvente

  • Scrii buton.addEventListener("click", obiect.metoda). În metodă, this este butonul, nu obiectul. Folosește obiect.metoda.bind(obiect) sau o funcție săgeată.
  • Apelezi removeEventListener cu un nou bind. Fiecare bind creează o funcție diferită; salvează funcția legată într-o variabilă.

Comenzi înrudite

  • Function.prototype.call / apply: Apelează o funcție alegând explicit valoarea lui this și parametrii.
  • => (arrow function): Scrie o funcție pe scurt, cu săgeata =>. Foarte folosită la map, filter și evenimente.
  • addEventListener: Rulează o funcție când se întâmplă ceva pe pagină: un clic, o tastă, trimiterea unui formular.