Function.prototype.call / apply în JavaScript

Structuri de control și funcții Toate browserele, Node.js

Apelează o funcție alegând explicit valoarea lui this și parametrii.

Sintaxă
functie.call(thisArg, arg1, arg2, ...)
functie.apply(thisArg, [arg1, arg2, ...])

Ce face Function.prototype.call / apply

În JavaScript, this depinde de cum este apelată funcția. call și apply apelează funcția imediat, cu this setat la primul parametru.

Diferența este doar în felul în care dai argumentele: call le primește separat, iar apply le primește într-un tablou. În cod nou, apply este rar folosit, pentru că spread-ul face același lucru: f.call(obj, ...tablou).

Parametri

Parametru Descriere
thisArg Valoarea lui this în funcție.
arg1, arg2, ... / [argumente] Argumentele funcției: separate (call) sau într-un tablou (apply).

Ce returnează

Ce returnează funcția apelată.

Exemple

Exemplul 1: Aceeași funcție, alt this

function prezinta(salut, semn) {
  return `${salut}, sunt ${this.nume}${semn}`;
}

const ana = { nume: "Ana" };
console.log(prezinta.call(ana, "Bună", "!"));
console.log(prezinta.apply({ nume: "Dan" }, ["Salut", "."]));

Rezultat

Bună, sunt Ana!
Salut, sunt Dan.

Exemplul 2: Împrumutarea unei metode

const asemanator = { 0: "a", 1: "b", length: 2 };

console.log(Array.prototype.join.call(asemanator, "-"));
console.log(Math.max.apply(null, [4, 9, 2]));

Rezultat

a-b
9

Greșeli frecvente

  • Folosești call pe o funcție săgeată. Funcțiile săgeată nu au propriul this, iar primul argument este ignorat.

Comenzi înrudite

  • Function.prototype.bind: Creează o copie a funcției cu this fixat și, opțional, cu primii parametri completați.
  • function: Definește o funcție: un bloc de cod cu nume, pe care îl poți apela de câte ori ai nevoie.
  • => (arrow function): Scrie o funcție pe scurt, cu săgeata =>. Foarte folosită la map, filter și evenimente.