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

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í, Function.prototype.call() a Function.prototype.apply() 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 call() 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í apply() 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á, apply() se stává velmi šikovným. Na druhou stranu, call() 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 apply(), optimalizující jejich kód pro čitelnost i výkon.

Časté dotazy ohledně volání a žádosti v JavaScriptu

  1. Jaký je primární rozdíl mezi call() a apply()?
  2. call() přijímá argumenty individuálně, zatímco apply() přijímá argumenty jako pole.
  3. Umět call() a apply() 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 apply() přes call()?
  6. Použití apply() když máte pole argumentů nebo proměnný počet argumentů.
  7. Je mezi nimi výkonnostní rozdíl call() a apply()?
  8. Rozdíly ve výkonu jsou ve většině případů zanedbatelné, ale call() může být o něco rychlejší s pevným počtem argumentů.
  9. Jak call() a apply() zvládnout this kontext?
  10. Obě metody explicitně nastavují this kontext pro vyvolání funkce.
  11. Mohu použít call() a apply() 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í call() a apply()?
  14. Jsou užitečné pro výpůjčku metod a manipulaci s variadickými funkcemi.
  15. Jak to dělá call() zlepšit čitelnost kódu?
  16. call() činí vyvolání funkce jasnějším, když je znám a pevně stanoven počet argumentů.
  17. Umět apply() zvládnout neznámý počet argumentů?
  18. Ano, apply() 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í call a apply metody jsou mocné nástroje v JavaScriptu pro vyvolávání funkcí se zadaným this 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ů, apply 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.