Izpratne par atšķirību starp "zvanīt" un "pieteikties" JavaScript

JavaScript

Funkcijas izsaukšanas metodes JavaScript

JavaScript piedāvā vairākus funkciju izsaukšanas veidus, no kuriem divi ir `Function.prototype.call()` un `Function.prototype.apply()`. Abas metodes kalpo funkciju izsaukšanai ar norādītu “this” vērtību un argumentiem, taču tās atšķiras ar to, kā šie argumenti tiek nodoti.

Šī raksta mērķis ir izpētīt atšķirības starp “zvanīt” un “lietot”, to ietekme uz veiktspēju un scenāriji, kuros vienam varētu būt priekšroka, nevis otram. Beigās jums būs skaidrāka izpratne par to, kad savā JavaScript kodā ir jāizmanto “zvanīt” vai “pielietot”.

Izpētiet atšķirības starp 'zvanīt' un 'piemērot' JavaScript

JavaScript priekšgala piemērs

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

Izpratne par zvana un lietotnes veiktspēju JavaScript

JavaScript priekšgala piemērs

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

Funkcijas izsaukšanas funkciju “zvans” un “pieteikšanās” salīdzinājums JavaScript

Node.js aizmugursistēmas piemērs

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

Izvēle starp "zvanīt" un "pielietot" JavaScript izstrādē

JavaScript veiktspējas analīze

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

Padziļināts ieskats izsaukšanā un metožu lietošanā JavaScript

Papildus to pamatlietojumam, un ir vairāki uzlaboti lietošanas gadījumi, kas var uzlabot jūsu JavaScript programmēšanu. Viens no šādiem izmantošanas gadījumiem ir metožu aizņēmums, kur metodes no viena objekta aizņem cits. Tas ir īpaši noderīgi, ja jums ir objekts, kuram ir jāizmanto cita objekta metode bez mantojuma. Izmantojot un apply(), varat uz laiku aizņemties metodes un izpildīt tās dažādu objektu kontekstā, tādējādi uzlabojot koda atkārtotu izmantošanu un samazinot dublēšanu.

Vēl viens svarīgs aspekts, kas jāņem vērā, ir izmantošana variadic funkcijām — funkcijas, kas pieņem mainīgu argumentu skaitu. Ja jums ir argumentu masīvs un tie jānodod funkcijai, kas nepieņem masīvu, kļūst ārkārtīgi parocīgs. No otras puses, var būt noderīgi scenārijos, kad veiktspēja ir kritiska un argumentu skaits ir zināms un fiksēts. Izprotot šīs nianses, izstrādātāji var pieņemt pārdomātākus lēmumus par lietošanas laiku call() pret , optimizējot to kodu gan lasāmībai, gan veiktspējai.

  1. Kāda ir galvenā atšķirība starp un ?
  2. pieņem argumentus individuāli, kamēr pieņem argumentus kā masīvu.
  3. Var un lietot aizvietojami?
  4. Jā, viņi var sasniegt tādu pašu rezultātu, taču izvēle ir atkarīga no argumentu struktūras.
  5. Kad man vajadzētu dot priekšroku beidzies ?
  6. Izmantot ja jums ir argumentu masīvs vai mainīgs argumentu skaits.
  7. Vai ir veiktspējas atšķirība starp un ?
  8. Veiktspējas atšķirības vairumā gadījumu ir niecīgas, taču var būt nedaudz ātrāks ar fiksētu argumentu skaitu.
  9. Kā un rīkoties ar kontekstā?
  10. Abas metodes skaidri nosaka funkcijas izsaukšanas konteksts.
  11. Vai es varu izmantot un ar konstruktora funkcijām?
  12. Nē, tie nav piemēroti konstruktora funkcijām, jo ​​tie nerada jaunas instances.
  13. Kam paredzēti daži uzlabotas lietošanas gadījumi un ?
  14. Tie ir noderīgi metožu aizņemšanai un variadic funkciju apstrādei.
  15. Kā uzlabot koda lasāmību?
  16. padara funkcijas izsaukšanu skaidrāku, ja ir zināms un fiksēts argumentu skaits.
  17. Var apstrādāt nezināmu argumentu skaitu?
  18. Jā, ir ideāli piemērots funkcijām, kurām nepieciešams apstrādāt mainīgu argumentu skaitu.

Pēdējās domas par funkciju izsaukšanas metodēm

Noslēgumā gan un metodes ir spēcīgi JavaScript rīki funkciju izsaukšanai ar norādītu vērtību. Izvēle starp tiem lielā mērā ir atkarīga no tā, kā funkcijai vēlaties nodot argumentus. Kamēr call ir vislabākais, strādājot ar noteiktu argumentu skaitu, spīd, apstrādājot masīvus vai nezināmu skaitu argumentu. Šo nianšu izpratne palīdz rakstīt efektīvāku un lasāmāku kodu, kas galu galā noved pie labākas JavaScript programmēšanas prakses.