Saya memiliki fungsi javascript statis yang dapat mengambil 1, 2 atau 3 parameter:
function getData(id, parameters, callback) //parameters (associative array) and callback (function) are optional
Saya tahu saya selalu dapat menguji apakah parameter yang diberikan tidak terdefinisi, tetapi bagaimana saya tahu jika yang dilewati adalah parameter atau panggilan balik?
Apa cara terbaik untuk melakukan ini?
Contoh dari apa yang bisa diteruskan:
1:
getData('offers');
2:
var array = new Array();
array['type']='lalal';
getData('offers',array);
3:
var foo = function (){...}
getData('offers',foo);
4:
getData('offers',array,foo);
javascript
jd.
sumber
sumber
Jawaban:
Anda dapat mengetahui berapa banyak argumen yang diteruskan ke fungsi Anda dan Anda dapat memeriksa apakah argumen kedua Anda adalah fungsi atau tidak:
Anda juga dapat menggunakan objek argumen dengan cara ini:
Jika Anda tertarik, coba lihat artikel ini oleh John Resig, tentang teknik untuk mensimulasikan metode kelebihan beban di JavaScript.
sumber
Er - itu akan menyiratkan bahwa Anda menjalankan fungsi Anda dengan argumen yang tidak dalam urutan yang tepat ... yang saya tidak akan merekomendasikan.
Saya akan merekomendasikan sebagai gantinya memberi makan objek ke fungsi Anda seperti:
Manfaat:
Kekurangan:
Jika Anda tidak punya pilihan, Anda bisa menggunakan fungsi untuk mendeteksi apakah suatu objek memang sebuah fungsi (lihat contoh terakhir).
Catatan: Ini adalah cara yang tepat untuk mendeteksi suatu fungsi:
sumber
Jadi gunakan typeof operator untuk menentukan apakah parameter kedua adalah array atau fungsi.
Ini dapat memberikan beberapa saran: http://www.planetpdf.com/developer/article.asp?ContentID=testing_for_object_types_in_ja
Saya tidak yakin apakah ini pekerjaan atau pekerjaan rumah, jadi saya tidak ingin memberikan jawaban saat ini, tetapi jenisnya akan membantu Anda menentukannya.
sumber
Anda harus memeriksa jenis parameter yang diterima. Mungkin Anda harus menggunakan
arguments
array karena parameter kedua kadang-kadang bisa menjadi 'parameter' dan kadang-kadang 'panggilan balik' dan menamai parameter itu mungkin menyesatkan.sumber
Saya tahu ini adalah pertanyaan yang cukup lama, tetapi saya mengatasinya baru-baru ini. Beri tahu saya apa pendapat Anda tentang solusi ini.
Saya membuat sebuah utilitas yang memungkinkan saya mengetik argumen dan menjadikannya opsional. Anda pada dasarnya membungkus fungsi Anda dalam proxy. Jika Anda melewatkan argumen, itu tidak terdefinisi . Mungkin aneh jika Anda memiliki beberapa argumen opsional dengan jenis yang sama tepat di sebelah satu sama lain. (Ada opsi untuk melewati fungsi alih-alih jenis untuk melakukan pemeriksaan argumen khusus, serta menentukan nilai default untuk setiap parameter.)
Seperti inilah implementasinya:
Untuk kejelasan, inilah yang sedang terjadi:
Anda dapat melihat kode proxy arragrr di repositori GitHub saya di sini:
https://github.com/joelvh/Sysmo.js/blob/master/sysmo.js
Berikut adalah fungsi utilitas dengan beberapa komentar yang disalin dari repositori:
sumber
Saya merekomendasikan Anda untuk menggunakan ArgueJS .
Anda cukup mengetik fungsi Anda dengan cara ini:
Saya menganggap dengan contoh Anda bahwa Anda ingin
id
parameter Anda menjadi string, bukan? Sekarang,getData
membutuhkanString id
dan menerima opsionalObject parameters
danFunction callback
. Semua kasus penggunaan yang Anda poskan akan berfungsi seperti yang diharapkan.sumber
Anda bisa menggunakan properti objek argumen di dalam fungsi.
sumber
Maksud Anda, Anda dapat memiliki panggilan seperti ini: getData (id, parameter); getData (id, callback)?
Dalam hal ini Anda tidak dapat dengan jelas mengandalkan posisi dan Anda harus mengandalkan menganalisis tipe: getType () dan kemudian jika perlu getTypeName ()
Periksa apakah parameter yang dimaksud adalah array atau fungsi.
sumber
Saya pikir Anda ingin menggunakan typeof () di sini:
sumber
Jika masalah Anda hanya dengan fungsi yang berlebihan (Anda perlu memeriksa apakah parameter 'parameter' adalah 'parameter' dan bukan 'callback'), saya akan merekomendasikan Anda tidak repot tentang jenis argumen dan
menggunakan pendekatan ini . Idenya sederhana - gunakan objek literal untuk menggabungkan parameter Anda:
sumber
Saya kira ini mungkin contoh yang cukup jelas:
sumber
Bisakah Anda mengganti fungsinya? Apakah ini tidak akan berhasil:
sumber