Pochopení rozdílu mezi `call` a `apply` v JavaScriptu

JavaScript

Metody vyvolání funkcí v JavaScriptu

JavaScript nabízí několik způsobů, jak vyvolat funkce, dva z nich jsou `Function.prototype.call()` a `Function.prototype.apply()`. Obě metody slouží k volání funkcí se zadanou hodnotou `this` a argumenty, liší se však ve způsobu předávání těchto argumentů.

Tento článek si klade za cíl prozkoumat rozdíly mezi funkcemi `call` a `apply`, jejich dopady na výkon a scénáře, kdy může být jeden preferován před druhým. Na konci budete mít jasnější představu o tom, kdy v kódu JavaScript použít `call` nebo `apply`.

Zkoumání rozdílů mezi `call` a `apply` v JavaScriptu

Příklad rozhraní JavaScript

// Example of Function.prototype.call()
const person = {
  fullName: function() {
    return this.firstName + " " + this.lastName;
  }
};

const person1 = {
  firstName: "John",
  lastName: "Doe"
};

console.log(person.fullName.call(person1)); // John Doe

Porozumění výkonu funkce `call` vs `apply` v JavaScriptu

Příklad rozhraní JavaScript

// Example of Function.prototype.apply()
const person = {
  fullName: function(city, country) {
    return this.firstName + " " + this.lastName + ", " + city + ", " + country;
  }
};

const person2 = {
  firstName: "Jane",
  lastName: "Doe"
};

console.log(person.fullName.apply(person2, ["Oslo", "Norway"])); // Jane Doe, Oslo, Norway

Porovnání `call` a `apply` pro vyvolání funkce v JavaScriptu

Příklad backendu Node.js

const person = {
  fullName: function(city, country) {
    return this.firstName + " " + this.lastName + ", " + city + ", " + country;
  }
};

const person3 = {
  firstName: "Alice",
  lastName: "Smith"
};

function printName(method) {
  if (method === 'call') {
    console.log(person.fullName.call(person3, 'Paris', 'France'));
  } else if (method === 'apply') {
    console.log(person.fullName.apply(person3, ['Paris', 'France']));
  }
}

printName('call');  // Alice Smith, Paris, France
printName('apply'); // Alice Smith, Paris, France

Výběr mezi `call` a `apply` ve vývoji JavaScriptu

Analýza výkonu JavaScriptu

const iterations = 1000000;
const person = {
  fullName: function(city, country) {
    return this.firstName + " " + this.lastName + ", " + city + ", " + country;
  }
};
const person4 = {
  firstName: "Bob",
  lastName: "Brown"
};

console.time('call');
for (let i = 0; i < iterations; i++) {
  person.fullName.call(person4, 'Berlin', 'Germany');
}
console.timeEnd('call');

console.time('apply');
for (let i = 0; i < iterations; i++) {
  person.fullName.apply(person4, ['Berlin', 'Germany']);
}
console.timeEnd('apply');

Hlubší přehled o volání a aplikaci metod v JavaScriptu

Kromě jejich základního použití, a mají několik pokročilých případů použití, které mohou zlepšit vaše programování v JavaScriptu. Jedním z takových případů použití je výpůjčka metod, kdy jsou metody z jednoho objektu vypůjčeny jiným. To je zvláště užitečné, když máte objekt, který potřebuje použít metodu z jiného objektu bez dědičnosti. Použitím a apply(), můžete si dočasně vypůjčit metody a spustit je v kontextu různých objektů, čímž se zlepší znovupoužitelnost kódu a sníží se redundance.

Dalším důležitým aspektem, který je třeba zvážit, je použití pro variadické funkce – funkce, které přijímají proměnný počet argumentů. Když máte pole argumentů a potřebujete je předat funkci, která pole nepřijímá, se stává velmi šikovným. Na druhou stranu, může být užitečné ve scénářích, kde je kritický výkon a počet argumentů je známý a pevně daný. Díky pochopení těchto nuancí mohou vývojáři přijímat informovanější rozhodnutí o tom, kdy je použít call() proti , optimalizující jejich kód pro čitelnost i výkon.

  1. Jaký je primární rozdíl mezi a ?
  2. přijímá argumenty individuálně, zatímco přijímá argumenty jako pole.
  3. Umět a používat zaměnitelně?
  4. Ano, mohou dosáhnout stejného výsledku, ale výběr závisí na tom, jak jsou argumenty strukturovány.
  5. Kdy bych měl preferovat přes ?
  6. Použití když máte pole argumentů nebo proměnný počet argumentů.
  7. Je mezi nimi výkonnostní rozdíl a ?
  8. Rozdíly ve výkonu jsou ve většině případů zanedbatelné, ale může být o něco rychlejší s pevným počtem argumentů.
  9. Jak a zvládnout kontext?
  10. Obě metody explicitně nastavují kontext pro vyvolání funkce.
  11. Mohu použít a s funkcemi konstruktoru?
  12. Ne, nejsou vhodné pro funkce konstruktoru, protože nevytvářejí nové instance.
  13. K čemu jsou nějaké pokročilé případy použití a ?
  14. Jsou užitečné pro výpůjčku metod a manipulaci s variadickými funkcemi.
  15. Jak to dělá zlepšit čitelnost kódu?
  16. činí vyvolání funkce jasnějším, když je znám a pevně stanoven počet argumentů.
  17. Umět zvládnout neznámý počet argumentů?
  18. Ano, je ideální pro funkce, které potřebují zpracovat proměnný počet argumentů.

Závěrečné úvahy o metodách vyvolání funkcí

Závěrem obojí a metody jsou mocné nástroje v JavaScriptu pro vyvolávání funkcí se zadaným hodnota. Volba mezi nimi závisí do značné míry na tom, jak chcete funkci předat argumenty. Zatímco call je nejlepší, když se zabýváte pevným počtem argumentů, svítí při manipulaci s poli nebo neznámým počtem argumentů. Pochopení těchto nuancí pomáhá při psaní efektivnějšího a čitelnějšího kódu, což nakonec vede k lepším postupům programování v JavaScriptu.