Jika Anda tidak pernah terpapar bahasa yang dinamis dan memahami JavaScript dalam pola pikir bahasa yang dikompilasi, Anda akan memiliki perasaan magis dan aneh, karena hal -hal yang sering kali tidak mungkin terjadi dalam kesadaran terjadi, dan bahkan merasa tidak masuk akal. Jika Anda menghadapi perasaan ini dalam proses belajar JavaScript, bahasa yang bebas dan tak berujung, maka dari formulir ini, tolong lepaskan "prasangka" Anda, karena ini jelas merupakan dunia baru bagi Anda, biarkan JavaScript perlahan -lahan melelehkan kesadaran pemrograman yang dipadatkan sebelumnya dan menyuntikkan vitalitas baru!
Oke, mari kita kembali ke intinya, pertama -tama pahami karakteristik konteks JavascrTipt runtime yang diubah secara dinamis. Karakteristik ini terutama tercermin dalam penerapan dua metode aplikasi dan panggilan.
Untuk membedakan Apply, hubungi satu kalimat,
foo.call (ini, arg1, arg2, arg3) == foo.Apply (ini, argumen) == this.foo (arg1, arg2, arg3)
Panggilan dan terapkan keduanya milik metode fungsi.prototype. Ini diimplementasikan secara intrinsik oleh mesin JavaScript. Karena itu termasuk fungsi.prototype, setiap instance objek fungsi, yaitu, masing -masing metode memiliki Atribut Panggilan dan Terapkan. Karena ini adalah properti dari suatu metode, penggunaannya tentu saja ditujukan untuk metode ini. Kedua metode ini mudah dibingungkan karena mereka memiliki fungsi yang sama, tetapi mereka digunakan secara berbeda.
Kesamaan: Efek dari dua metode persis sama
Perbedaan: Parameter yang disahkan oleh metode ini berbeda
Jadi apa efek dari metode ini dan apa parameter yang dilewati oleh metode ini?
Mari kita analisis foo.call di atas (ini, arg1, arg2, arg3).
FOO adalah metode, ini adalah objek yang berhubungan dengan konteks ketika metode dieksekusi, Arg1, ARG2, dan ARG3 adalah parameter yang diteruskan ke metode FOO. Yang disebut objek terkait konteks ketika metode dieksekusi, jika ada basis pemrograman yang berorientasi objek, mudah dipahami, inilah dalam objek setelah instantiasi kelas.
Dalam JavaScript, kode selalu memiliki objek konteks, dan kode memprosesnya di dalamnya. Objek konteks diwujudkan oleh variabel ini, yang selalu menunjuk pada objek di mana kode saat ini berada.
Untuk lebih memahami apa ini, berikan contoh.
/Buat fungsi kelas A () {// Kode berikut akan dijalankan ketika kelas dipakai // Objek konteks eksekusi saat ini adalah ini, yang merupakan objek instance saat ini this.message = "pesan A"; this.getMessage = function () {<span style = "white-space: pre"> </span> kembalikan this.message; <span style = "white-space: pre"> </span>}} // buat kelas a instance a neard a (clomes a (); Fungsi b b () {this.message = "pesan b"; this.setMessage = function (msg) {<span style = "white-space: pre"> </span> this.message = msg; <span style = "white-space: pre"> </span>}} // Buat objek instance kelas b var a = baru b ();Dapat dilihat bahwa Kelas A dan B memiliki atribut pesan (terhadap anggota yang disebutkan dalam objek). A memiliki metode GetMessage untuk mendapatkan pesan, dan B memiliki metode setMessage untuk mengatur pesan. Berikut ini adalah untuk menunjukkan kekuatan panggilan.
// Dinamis Tetapkan metode setMessage B ke Object a. Perhatikan bahwa A sendiri tidak memiliki metode ini! b.setMessage.call (a, "pesan A"); // semua menampilkan peringatan "pesan A" (a.getMessage ()); // Dinamis Tetapkan metode getMessage dari A ke objek b. Perhatikan bahwa B sendiri tidak memiliki metode ini!
Ini adalah kekuatan panggilan JavaScript bahasa dinamis!
Ini hanya "menciptakan sesuatu dari ketiadaan". Metode objek dapat ditetapkan secara sewenang -wenang, tetapi objek itu sendiri tidak pernah memiliki metode ini. Perhatikan bahwa itu adalah tugas. Dalam istilah awam, metode ini adalah meminjamkan objek lain untuk menyelesaikan tugas. Pada prinsipnya, objek konteks berubah ketika metode dieksekusi.
Oleh karena itu, b.setMessage.call (a, "pesan A"); setara dengan menggunakan A sebagai objek konteks untuk memanggil metode setMessage objek B saat mengeksekusi, dan proses ini tidak memiliki hubungan dengan B, dan efeknya setara dengan a.setMessage ("pesan A");
Karena efek dari Apply dan Call adalah sama, dapat dikatakan itu
Panggilan, fungsi berlaku adalah meminjam metode orang lain untuk menelepon, seperti memanggilnya sendiri.
Ok, setelah memahami kesamaan antara panggilan dan berlaku - setelah memahaminya, mari kita lihat perbedaan mereka. Setelah melihat contoh -contoh di atas, saya yakin Anda tahu tentang itu.
Dari b.setMessage.call (A, "Pesan A") setara dengan A.SetMessage ("Pesan A") dapat dilihat bahwa "pesan A" dilewatkan sebagai parameter dalam panggilan,
Jadi bagaimana artinya di Apply? Sulit menjelaskannya dengan jelas. Terapkan perlu dikombinasikan dengan skenario aplikasi agar jelas sekilas. Mari kita merancang skenario aplikasi:
Fungsi cetak (a, b, c, d) {alert (a + b + c + d);} Contoh fungsi (a, b, c, d) {// pinjam cetak dalam metode panggilan, dan secara eksplisit membubarkan parameter untuk meneruskan cetak. print.apply (ini, argumen); // atau enkapsulasinya ke dalam array print.Apply (ini, [a, b, c, d]);} // contoh "skrip backlit" ("belakang", "ringan", "kaki", "ini"););Dalam skenario ini, dalam metode contoh, a, b, c, d digunakan sebagai parameter yang dilewati oleh metode ini, dan metode penggunaan berlaku dan panggilan untuk meminjam metode cetak untuk dihubungi.
Dalam kalimat terakhir, karena metode contoh disebut secara langsung, objek konteks dalam metode ini adalah objek jendela.
Oleh karena itu, kecuali untuk parameter pertama, yaitu, objek konteksnya sama ketika mengeksekusi, parameter lain dari metode panggilan akan diteruskan ke metode pinjaman sebagai parameter pada gilirannya, sementara Apply memiliki dua parameter, dan parameter kedua dilewatkan dalam array. Jadi bisa dikatakan itu
Perbedaan antara metode Call dan Apply adalah bahwa mulai dari parameter kedua, parameter metode panggilan akan diteruskan ke metode pinjaman sebagai parameter pada gilirannya, sementara berlaku secara langsung menempatkan parameter ini ke dalam array dan kemudian meneruskannya. Akhirnya, daftar parameter metode pinjaman adalah sama.
Skenario aplikasi:
Panggilan tersedia saat parameternya jelas, dan menerapkan argumen dapat digunakan ketika parameter tidak jelas.
// contoh print.call (jendela, "belakang", "cahaya", "kaki", "this"); // parameter foo mungkin berupa beberapa fungsi foo () {<span style = "white-space: pre"> </span> print.apply (window, argumen);}Artikel di atas sangat memahami perbedaan antara metode Apply () dan Call () dalam JavaScript. Ini semua konten yang saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.