Bagaimana Anda tahu jika suatu fungsi dalam JavaScript didefinisikan?
Saya ingin melakukan sesuatu seperti ini
function something_cool(text, callback) {
alert(text);
if( callback != null ) callback();
}
Tapi itu membuat saya
panggilan balik bukan fungsi
kesalahan saat panggilan balik tidak ditentukan.
javascript
reflection
Aaron Lee
sumber
sumber
Semua jawaban saat ini menggunakan string literal, yang saya lebih suka tidak ada dalam kode saya jika mungkin - ini tidak (dan memberikan makna semantik yang berharga, untuk boot):
Secara pribadi, saya mencoba untuk mengurangi jumlah string yang berkeliaran di kode saya ...
Juga, sementara saya sadar itu
typeof
adalah operator dan bukan fungsi, ada sedikit bahaya dalam menggunakan sintaks yang membuatnya muncul sebagai yang terakhir.sumber
isFunction(not_defined))
mananot_defined
nama fungsi yang tidak didefinisikan dan FireBug kembalinot_defined is not defined
yang benar tetapi fungsi Anda harus mengembalikan false dan tidak menghasilkan kesalahan ...not_defined
untuk meneruskan nilainyaisFunction()
dan gagal menyelesaikannya. Tidak ada yang bisa dilakukan untuk definisiisFunction()
untuk menyelesaikan masalah ini.isFunction
dan lakukan saja(typeof no_function == typeof Function)
.typeof(Function())
karena Fungsi adalah fungsi; tetapi begitu juga Array, Object, dan prototipe bawaan lainnya (karena tidak ada istilah yang lebih baik). Jika Anda memeriksa array yang tidak akan Anda gunakantypeof(array) === typeof(Array)
misalnya; Anda akan menggunakantypeof(array) === typeof(Array())
karena Anda benar-benar perlu mengevaluasi fungsi jika Anda berhati-hati dan konsisten.Catatan panggilan balik itu (dengan sendirinya) mengevaluasi ke
false
jikaundefined
,null
,0
, ataufalse
. Membandingkan dengannull
terlalu spesifik.sumber
callback
sendiri mengevaluasi ke nilai "false-y", maka tipenya tidak akan pernah menjadi "fungsi".Metode-metode untuk mengetahui apakah suatu fungsi diimplementasikan juga gagal jika variabel tidak didefinisikan sehingga kami menggunakan sesuatu yang lebih kuat yang mendukung penerimaan string:
sumber
typeof window.doesthisexist
sebagai gantidoesthisexist
. Namun, menggunakan eval (yang: jahat) seperti yang ditunjukkan hanya akan berfungsi dengan fungsi bernama - ini tidak akan berfungsi dengan kasus penggunaan dalam pertanyaan.Baru mengenal JavaScript Saya tidak yakin apakah perilakunya telah berubah tetapi solusi yang diberikan oleh Jason Bunting (6 tahun yang lalu) tidak akan berfungsi jika mungkinFungsi tidak didefinisikan.
Ini akan menimbulkan
ReferenceError: possibleFunction is not defined
kesalahan saat mesin mencoba untuk menyelesaikan simbolFungsi (seperti yang disebutkan dalam komentar untuk jawaban Jason)Untuk menghindari perilaku ini, Anda hanya dapat meneruskan nama fungsi yang ingin Anda periksa jika ada. Begitu
Ini menetapkan variabel menjadi fungsi yang ingin Anda periksa atau objek kosong jika tidak ditentukan dan menghindari masalah yang disebutkan di atas.
sumber
Mencoba:
sumber
sumber
sumber
if(typeof Function === typeof callback)...
? :)typeof
mengembalikan sesuatu yang berbeda di kemudian hari (mungkin "Function" alih-alih "function"), karena implementasi JavaScript yang baru / berbeda - rasanya seperti kecil kemungkinannya bahwa implementasi baru / berbeda akan mematahkantypeof Function === typeof callback
pemeriksaan karena harus sama di tingkat semantik.sumber
Mungkin saya lakukan
Saya tahu ada jawaban yang diterima, tetapi tidak ada yang menyarankan ini. Saya tidak begitu yakin apakah ini cocok dengan deskripsi idiomatik, tetapi ini berfungsi untuk semua kasus.
Dalam mesin JavaScript yang lebih baru, a
finally
dapat digunakan sebagai gantinya.sumber
typeof callback
pula.accepted_types.indexOf(typeof value) !== -1
untuk melihat apakah itu dalam berbagai jenis. Dalam situasi ini pengecualian menurut saya akan menjadi penghalang.Coba ini:
sumber
Jika Anda melihat sumber perpustakaan @Venkat Sudheer Reddy Aedama yang disebutkan, underscorejs, Anda dapat melihat ini:
Ini hanya PETUNJUK saya, PETUNJUK jawaban:>
sumber
Mencoba:
sumber
Jika Anda menggunakan http://underscorejs.org , Anda memiliki: http://underscorejs.org/#isFunction
sumber
Saya sedang mencari cara untuk memeriksa apakah fungsi jQuery didefinisikan dan saya tidak menemukannya dengan mudah.
Mungkin mungkin membutuhkannya;)
sumber
type0f($.datepicker) !== undefiled
sebaliknyaobject
Jika
callback()
Anda memanggil bukan hanya untuk satu kali dalam suatu fungsi, Anda bisa menginisialisasi argumen untuk digunakan kembali:Sebagai contoh:
Batasannya adalah ia akan selalu mengeksekusi argumen callback meskipun tidak terdefinisi.
sumber
Untuk fungsi global, Anda dapat menggunakan yang ini alih-alih
eval
disarankan dalam salah satu jawaban.Anda bisa menggunakan
global.f instanceof Function
juga, tapi afaik. nilaiFunction
akan berbeda dalam bingkai yang berbeda, sehingga hanya akan berfungsi dengan aplikasi bingkai tunggal dengan benar. Itu sebabnya kami biasanya menggunakantypeof
sebagai gantinya. Perhatikan bahwa dalam beberapa lingkungan dapat terjadi anomalitypeof f
juga, misalnya oleh MSIE 6-8 beberapa fungsi misalnyaalert
memiliki tipe "objek".Dengan fungsi-fungsi lokal, Anda dapat menggunakannya di jawaban yang diterima. Anda dapat menguji apakah fungsinya juga lokal atau global.
Untuk menjawab pertanyaan, kode contoh berfungsi untuk saya tanpa kesalahan di peramban terbaru, jadi saya tidak yakin apa masalahnya dengan itu:
Catatan: Saya akan menggunakan
callback !== undefined
sebagai gantinyacallback != null
, tetapi mereka melakukan hampir sama.sumber
Sebagian besar jika tidak semua jawaban sebelumnya memiliki efek samping untuk menjalankan fungsi
di sini praktik terbaik
Anda memiliki fungsi
sumber
Jika Anda ingin mendefinisikan kembali fungsi, yang terbaik adalah menggunakan variabel fungsi, yang didefinisikan dalam urutan kejadiannya, karena fungsi didefinisikan secara global, di mana pun mereka terjadi.
Contoh membuat fungsi baru yang memanggil fungsi sebelumnya dengan nama yang sama:
sumber
Ini berhasil untuk saya
sumber
Solusi satu baris:
sumber