Untuk memperingati bahwa saya belum pernah menulis blog selama 10 tahun, posting blog pertama akan dimulai dengan trik yang menarik -___-
Dalam ES5, ketika kita memanggil fungsi, jika parameter yang akan dilewati dihasilkan berdasarkan fungsi atau kondisi lain, yaitu, ketika kita tidak yakin berapa banyak parameter yang akan dilewati, apa yang harus kita lakukan tanpa mengubah fungsi asli?
(Tentu saja, cobalah untuk menghindari situasi yang dijelaskan dalam artikel ini, seperti mengubah parameter menjadi objek atau array, dll.)
Kebanyakan orang mungkin tahu bahwa menggunakan Apply dapat menyelesaikan masalah ini dengan sempurna:
Seperti panggilan, terapkan parameter pertama akan digunakan sebagai objek panggilan fungsi, yaitu, penunjuk ini dalam fungsi panggilan ditulis ulang sebagai parameter pertama. Jika bukan metode objek, Anda dapat mengabaikan ini dan melewati nol.
Perbedaannya adalah bahwa parameter berikut, berlaku menempatkan semua parameter untuk diteruskan ke fungsi panggilan dalam array, dan panggilan ditambahkan secara berurutan seperti fungsi asli.
Karena itu adalah array, itu bisa dikendalikan. Menghasilkan array berdasarkan fungsi lain atau penilaian logis dapat mencapai tujuan lulus dalam parameter angka dinamis.
Tapi saya mengalami sakit kepala. Saya harus lulus dalam parameter dinamis saat membuat objek dengan yang baru. Hanya butuh waktu sekali setiap beberapa tahun:
Jika Anda menggunakan ES6, dengan parameter sisanya, tidak ada masalah di atas yang bermasalah. Perhatikan bahwa menambahkan tiga poin sebelum array args bukan kesalahan sintaks, tetapi metode penulisan parameter rest yang disediakan oleh ES6. Anda dapat memahaminya sebagai menggantikan ... args dengan array array dengan karakter setelah tanda kurung persegi.
Tetapi apakah benar -benar tidak mungkin untuk diterapkan di ES5? Bagaimanapun, sebagian besar ES6 adalah gula sintaksis, dan Anda dapat menggunakan alat seperti Babel untuk dikompilasi ke ES5. Dengan pertanyaan, mari kita gunakan Babel untuk mengkompilasi dan melihat apa yang kita dapatkan:
Saya terkejut ketika melihat baris terakhir. Jangan takut. Mari kita analisis kode ini. Pertama, mari kita dariku dan lihat dalam tiga langkah:
1. Tidak ada keraguan bahwa menggunakan concat untuk menggabungkan nol dengan parameter kami ke dalam array, seperti yang diterapkan parameter kedua, yaitu, kita mendapatkan [null, 1, 2, 3];
2. Mari kita hitung berlaku. Parameter pertama FOO akan menggantikan fungsi untuk memanggil metode BIND asli. Isi array parameter kedua akan diteruskan sebagai parameter bind, yaitu foo.bind (null, 1, 2, 3);
3. Parameter pertama dari metode BIND mirip untuk diterapkan dan panggilan, memodifikasi pointer ini, dan parameter selanjutnya dapat menanamkan nilai argumen terkemuka preset default untuk fungsi tersebut. Dengan kata lain, ketika ikatan dieksekusi, kami mendapatkan kelas foo dengan tiga nilai parameter yang disuntikkan dalam set braket pertama, yang disebut foowithargs untuk saat ini;
Akhirnya, ketika kami foowithargs baru (); , kami tidak perlu lulus dalam parameter apa pun. Setara dengan foo baru (1, 2, 3);