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

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, Function.prototype.call() un Function.prototype.apply() 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 call() 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 apply() 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, apply() kļūst ārkārtīgi parocīgs. No otras puses, call() 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 apply(), optimizējot to kodu gan lasāmībai, gan veiktspējai.

Bieži uzdotie jautājumi par zvanu un pieteikšanos JavaScript

  1. Kāda ir galvenā atšķirība starp call() un apply()?
  2. call() pieņem argumentus individuāli, kamēr apply() pieņem argumentus kā masīvu.
  3. Var call() un apply() 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 apply() beidzies call()?
  6. Izmantot apply() ja jums ir argumentu masīvs vai mainīgs argumentu skaits.
  7. Vai ir veiktspējas atšķirība starp call() un apply()?
  8. Veiktspējas atšķirības vairumā gadījumu ir niecīgas, taču call() var būt nedaudz ātrāks ar fiksētu argumentu skaitu.
  9. call() un apply() rīkoties ar this kontekstā?
  10. Abas metodes skaidri nosaka this funkcijas izsaukšanas konteksts.
  11. Vai es varu izmantot call() un apply() 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 call() un apply()?
  14. Tie ir noderīgi metožu aizņemšanai un variadic funkciju apstrādei.
  15. call() uzlabot koda lasāmību?
  16. call() padara funkcijas izsaukšanu skaidrāku, ja ir zināms un fiksēts argumentu skaits.
  17. Var apply() apstrādāt nezināmu argumentu skaitu?
  18. Jā, apply() 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 call un apply metodes ir spēcīgi JavaScript rīki funkciju izsaukšanai ar norādītu this 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, apply 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.