„JavaScript“ skirtumo tarp „skambinti“ ir „taikyti“ supratimas

„JavaScript“ skirtumo tarp „skambinti“ ir „taikyti“ supratimas
JavaScript

Funkcijų iškvietimo metodai „JavaScript“.

JavaScript“ siūlo keletą funkcijų iškvietimo būdų, iš kurių du yra „Function.prototype.call()“ ir „Function.prototype.apply()“. Abu metodai skirti iškviesti funkcijas su nurodyta „this“ verte ir argumentais, tačiau jie skiriasi tuo, kaip šie argumentai perduodami.

Šio straipsnio tikslas – ištirti skirtumus tarp „skambinti“ ir „taikyti“, jų poveikį našumui ir scenarijus, kai vienam gali būti teikiama pirmenybė prieš kitą. Pabaigoje aiškiau suprasite, kada „JavaScript“ kode naudoti „skambinti“ arba „taikyti“.

„JavaScript“ skirtumų tarp „skambinti“ ir „taikyti“ tyrinėjimas

„JavaScript“ sąsajos pavyzdys

// 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

„JavaScript“ „skambinimo“ ir „taikyti“ našumo supratimas

„JavaScript“ sąsajos pavyzdys

// 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

„JavaScript“ funkcijų iškvietimo „skambinti“ ir „taikyti“ palyginimas

Node.js Backend pavyzdys

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

„JavaScript“ kūrimo programoje pasirinkimas tarp „skambinti“ ir „taikyti“.

„JavaScript“ našumo analizė

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');

Gilesnė įžvalga apie iškvietimą ir metodų taikymą „JavaScript“.

Be pagrindinio naudojimo, Function.prototype.call() ir Function.prototype.apply() turi keletą išplėstinių naudojimo atvejų, kurie gali pagerinti jūsų JavaScript programavimą. Vienas iš tokių panaudojimo atvejų yra metodo skolinimasis, kai metodai iš vieno objekto pasiskolinami kito. Tai ypač naudinga, kai turite objektą, kuriam reikia naudoti metodą iš kito objekto be paveldėjimo. Naudojant call() ir apply(), galite laikinai pasiskolinti metodus ir vykdyti juos skirtingų objektų kontekste, taip pagerindami kodo pakartotinį naudojimą ir sumažindami perteklinį skaičių.

Kitas svarbus aspektas, į kurį reikia atsižvelgti, yra naudojimas apply() variadinėms funkcijoms – funkcijoms, kurios priima kintamą argumentų skaičių. Kai turite argumentų masyvą ir turite juos perduoti funkcijai, kuri nepriima masyvo, apply() tampa itin patogus. Iš kitos pusės, call() gali būti naudinga scenarijuose, kai našumas yra labai svarbus, o argumentų skaičius yra žinomas ir fiksuotas. Suprasdami šiuos niuansus, kūrėjai gali priimti labiau pagrįstus sprendimus, kada naudoti call() prieš apply(), optimizuodami savo kodą, kad būtų lengviau skaityti ir našiai.

Dažnai užduodami klausimai apie skambutį ir taikymą JavaScript

  1. Koks yra pagrindinis skirtumas tarp call() ir apply()?
  2. call() argumentus priima individualiai, tuo tarpu apply() priima argumentus kaip masyvą.
  3. Gali call() ir apply() naudoti pakaitomis?
  4. Taip, jie gali pasiekti tą patį rezultatą, tačiau pasirinkimas priklauso nuo argumentų struktūros.
  5. Kada turėčiau teikti pirmenybę apply() baigta call()?
  6. Naudokite apply() kai turite argumentų masyvą arba kintamą argumentų skaičių.
  7. Ar yra našumo skirtumas tarp call() ir apply()?
  8. Daugeliu atvejų našumo skirtumai yra nereikšmingi, tačiau call() gali būti šiek tiek greitesnis su fiksuotu argumentų skaičiumi.
  9. Kaip daryti call() ir apply() tvarkyti this kontekste?
  10. Abu metodai aiškiai nustato this funkcijos iškvietimo kontekstą.
  11. Ar galiu naudoti call() ir apply() su konstruktoriaus funkcijomis?
  12. Ne, jie netinka konstruktoriaus funkcijoms, nes nesukuria naujų egzempliorių.
  13. Kam skirti kai kurie išplėstinio naudojimo atvejai call() ir apply()?
  14. Jie naudingi skolinant metodus ir tvarkant įvairias funkcijas.
  15. Kaip call() pagerinti kodo skaitomumą?
  16. call() funkcijos iškvietimas tampa aiškesnis, kai žinomas ir fiksuotas argumentų skaičius.
  17. Gali apply() tvarkyti nežinomą skaičių argumentų?
  18. taip, apply() puikiai tinka funkcijoms, kurioms reikia apdoroti kintamą argumentų skaičių.

Baigiamosios mintys apie funkcijų iškvietimo metodus

Apibendrinant, tiek call ir apply metodai yra galingi JavaScript įrankiai, skirti iškviesti funkcijas su nurodytu this vertė. Pasirinkimas tarp jų labai priklauso nuo to, kaip norite perduoti argumentus funkcijai. Nors call geriausiai tinka sprendžiant fiksuotą argumentų skaičių, apply šviečia apdorojant masyvus arba nežinomą argumentų skaičių. Šių niuansų supratimas padeda rašyti efektyvesnį ir skaitomesnį kodą, o tai galiausiai lemia geresnę „JavaScript“ programavimo praktiką.