Memahami Perbezaan Antara `call` dan `apply` dalam JavaScript

Memahami Perbezaan Antara `call` dan `apply` dalam JavaScript
JavaScript

Kaedah Invokasi Fungsi dalam JavaScript

JavaScript menawarkan beberapa cara untuk menggunakan fungsi, dua daripadanya ialah `Function.prototype.call()` dan `Function.prototype.apply()`. Kedua-dua kaedah berfungsi untuk memanggil fungsi dengan nilai dan argumen `ini` yang ditentukan, tetapi kaedah tersebut berbeza dalam cara argumen ini dihantar.

Artikel ini bertujuan untuk meneroka perbezaan antara `panggilan` dan `mohon`, implikasi prestasinya dan senario yang mungkin lebih disukai daripada yang lain. Pada akhirnya, anda akan mempunyai pemahaman yang lebih jelas tentang masa untuk menggunakan `panggilan` atau `mohon` dalam kod JavaScript anda.

Meneroka Perbezaan Antara `panggil` dan `mohon` dalam JavaScript

Contoh Frontend 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

Memahami Prestasi `call` vs `apply` dalam JavaScript

Contoh Frontend 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

Membandingkan `panggilan` dan `mohon` untuk Invocation Fungsi dalam JavaScript

Contoh Bahagian Belakang 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

Memilih Antara `panggilan` dan `mohon` dalam Pembangunan JavaScript

Analisis Prestasi JavaScript

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

Insight Lebih mendalam ke dalam panggilan dan gunakan Kaedah dalam JavaScript

Sebagai tambahan kepada penggunaan asas mereka, Function.prototype.call() dan Function.prototype.apply() mempunyai beberapa kes penggunaan lanjutan yang boleh meningkatkan pengaturcaraan JavaScript anda. Satu kes penggunaan sedemikian ialah peminjaman kaedah, di mana kaedah dari satu objek dipinjam oleh yang lain. Ini amat berguna apabila anda mempunyai objek yang perlu menggunakan kaedah daripada objek lain tanpa warisan. menggunakan call() dan apply(), anda boleh meminjam kaedah buat sementara waktu dan melaksanakannya dalam konteks objek yang berbeza, dengan itu meningkatkan kebolehgunaan semula kod dan mengurangkan redundansi.

Satu lagi aspek penting untuk dipertimbangkan ialah penggunaan apply() untuk fungsi variadic—fungsi yang menerima bilangan argumen yang berubah-ubah. Apabila anda mempunyai pelbagai hujah dan anda perlu menghantarnya ke fungsi yang tidak menerima tatasusunan, apply() menjadi sangat berguna. Sebaliknya, call() boleh berguna dalam senario di mana prestasi adalah kritikal, dan bilangan hujah diketahui dan ditetapkan. Dengan memahami nuansa ini, pembangun boleh membuat keputusan yang lebih termaklum tentang masa untuk digunakan call() lawan apply(), mengoptimumkan kod mereka untuk kebolehbacaan dan prestasi.

Soalan Lazim tentang panggilan dan mohon dalam JavaScript

  1. Apakah perbezaan utama antara call() dan apply()?
  2. call() menerima hujah secara individu, manakala apply() menerima hujah sebagai tatasusunan.
  3. boleh call() dan apply() digunakan secara bergantian?
  4. Ya, mereka boleh mencapai hasil yang sama, tetapi pilihan bergantung pada cara hujah distrukturkan.
  5. Bilakah saya lebih suka apply() habis call()?
  6. guna apply() apabila anda mempunyai tatasusunan argumen atau bilangan argumen yang berubah-ubah.
  7. Adakah terdapat perbezaan prestasi antara call() dan apply()?
  8. Perbezaan prestasi boleh diabaikan dalam kebanyakan kes, tetapi call() boleh menjadi lebih pantas sedikit dengan bilangan argumen tetap.
  9. Bagaimana caranya call() dan apply() mengendalikan this konteks?
  10. Kedua-dua kaedah secara eksplisit menetapkan this konteks untuk seruan fungsi.
  11. Boleh saya guna call() dan apply() dengan fungsi pembina?
  12. Tidak, ia tidak sesuai untuk fungsi pembina kerana ia tidak mencipta kejadian baharu.
  13. Untuk beberapa kes penggunaan lanjutan untuk apa call() dan apply()?
  14. Ia berguna untuk kaedah peminjaman dan pengendalian fungsi variadic.
  15. Bagaimana call() meningkatkan kebolehbacaan kod?
  16. call() menjadikan seruan fungsi lebih jelas apabila bilangan hujah diketahui dan ditetapkan.
  17. boleh apply() mengendalikan bilangan hujah yang tidak diketahui?
  18. ya, apply() sesuai untuk fungsi yang perlu mengendalikan bilangan argumen yang berubah-ubah.

Pemikiran Akhir tentang Kaedah Invokasi Fungsi

Kesimpulannya, kedua-duanya call dan apply kaedah adalah alat yang berkuasa dalam JavaScript untuk menggunakan fungsi dengan yang ditentukan this nilai. Pilihan di antara mereka bergantung pada cara anda ingin menyampaikan hujah kepada fungsi tersebut. manakala call adalah yang terbaik apabila berurusan dengan bilangan hujah yang tetap, apply bersinar apabila mengendalikan tatasusunan atau bilangan argumen yang tidak diketahui. Memahami nuansa ini membantu dalam menulis kod yang lebih cekap dan boleh dibaca, akhirnya membawa kepada amalan pengaturcaraan JavaScript yang lebih baik.