Bagaimana saya bisa mengakses nama fungsi dari dalam fungsi itu?
// parasitic inheritance
var ns.parent.child = function() {
var parent = new ns.parent();
parent.newFunc = function() {
}
return parent;
}
var ns.parent = function() {
// at this point, i want to know who the child is that called the parent
// ie
}
var obj = new ns.parent.child();
javascript
function
Scott Klarenbach
sumber
sumber
Jawaban:
Dalam ES5, hal terbaik untuk dilakukan adalah:
Penggunaan
Function.caller
tidak standar.Function.caller
danarguments.callee
keduanya dilarang dalam mode ketat.Sunting: jawaban berbasis regex nus di bawah ini mencapai hal yang sama, tetapi memiliki kinerja yang lebih baik!
Di ES6, Anda bisa menggunakannya
myFunction.name
.Catatan: Berhati-hatilah bahwa beberapa minifiers JS mungkin membuang nama fungsi, untuk mengompres lebih baik; Anda mungkin perlu mengubah pengaturannya untuk menghindarinya.
sumber
fun.toString().substr(0, 100)
yang untuk kebutuhan saya akan cukup untuk menemukan fungsi yang dimaksud. Jadi, terima kasih atas inspirasinya!myFunction.name
adalah hal terbaik untuk dilakukan di ES6.myFunction.name
jika Anda mengetik nama fungsi? mengalahkan tujuan variabel sihir.arr[index].name
juga akan bekerja :)myFunction.name
juga akan diperbarui. Tentu saja, IntelliJ mendukung pengidentifikasian ulang string dalam string, tetapi itu bekerja jauh lebih konsisten dan diam-diam akan menjadi usang jika seseorang lupa untuk mencentang opsi "search in strings".myFunction.name
adalah pilihan yang sedikit lebih baik daripada hardcoding string.ES6 (terinspirasi oleh jawaban sendy halim di bawah):
Penjelasan tentang MDN . Pada 2015 bekerja di nodejs dan semua browser utama kecuali IE.
Catatan: Pada fungsi terikat ini akan menghasilkan "
bound <originalName>
". Anda harus menghapus "terikat" jika Anda ingin mendapatkan nama aslinya.ES5 (terinspirasi oleh jawaban Vlad):
Jika Anda memiliki referensi ke fungsi, Anda dapat melakukan:
caller
dancallee
dianggap sudah usang.[1] Saya memasukkannya di sini karena legal dan sering kali alat penyorotan sintaksis gagal memperhitungkan ruang putih antara nama fungsi dan tanda kurung. Di sisi lain, saya tidak mengetahui implementasi .toString () yang akan menyertakan ruang putih di sini, jadi itu sebabnya Anda bisa menghilangkannya.
Sebagai jawaban untuk pertanyaan awal, saya akan meninggalkan warisan parasit dan mencari beberapa pola desain OOP yang lebih tradisional. Saya menulis TidBits.OoJs untuk menulis kode OOP dalam JavaScript dengan nyaman dengan fitur yang meniru C ++ (belum lengkap, tetapi kebanyakan).
Saya melihat dari komentar bahwa Anda ingin menghindari menyampaikan informasi
parent
kepada konstruktornya. Saya harus mengakui bahwa pola desain tradisional tidak akan menyelamatkan Anda dari yang itu, karena umumnya dianggap hal yang baik untuk membuat ketergantungan Anda jelas dan ditegakkan.Saya juga menyarankan untuk menjauhi fungsi anonim. Mereka hanya membuat debug dan membuat profil PITA karena semuanya hanya muncul sebagai "fungsi anonim", dan tidak ada manfaatnya bagi mereka yang saya sadari.
sumber
.name
properti metode komponen muncul sebagai string "nilai", tidak peduli apa namanya. Cukup aneh, saat menguji dalam aplikasi expo itu baik-baik saja, namun, setelah dikompilasi menjadi aplikasi nyata, itu akan crash secara diam-diam.apa yang Anda lakukan adalah menetapkan fungsi tanpa nama ke variabel. Anda mungkin perlu menamai ekspresi fungsi sebagai gantinya ( http://kangax.github.com/nfe/ ).
namun saya tidak yakin berapa banyak browser lintas itu; ada masalah dengan IE6 yang membuat nama Anda berfungsi bocor ke lingkup luar. juga, argumen.callee agak usang dan akan menghasilkan kesalahan jika Anda menggunakan
strict mode
.sumber
Apa pun
constructor
memperlihatkan propertiname
, yang merupakan nama fungsi. Anda mengaksesconstructor
via instance (menggunakannew
) atauprototype
:sumber
console.log
Log panggilan pertamawindow
atauObject
untuk saya tergantung di mana saya menjalankannya, bukanPerson
.Sepertinya hal yang paling bodoh, yang saya tulis dalam hidup saya, tapi itu lucu: D
d
- kedalaman tumpukan.0
- kembalikan nama fungsi ini,1
- orang tua, dll.;[0 + d]
- hanya untuk memahami - apa yang terjadi;firefoxMatch
- bekerja untuk safari, tetapi saya benar-benar memiliki sedikit waktu untuk pengujian, karena pemilik mac telah kembali setelah merokok, dan mengusir saya: '(Pengujian:
Hasil:
Chrome:
Fitefox:
Solusi ini dibuat hanya untuk bersenang-senang ! Jangan menggunakannya untuk proyek nyata. Itu tidak tergantung pada spesifikasi ES, itu hanya tergantung pada realisasi browser. Setelah pembaruan chrome / firefox / safari berikutnya mungkin rusak.
Lebih dari itu tidak ada kesalahan (ha) pemrosesan - jika
d
akan lebih dari panjang tumpukan - Anda akan mendapatkan kesalahan;Untuk pola pesan kesalahan wrowsers lainnya - Anda akan mendapatkan kesalahan;
Ini harus bekerja untuk kelas ES6 (
.split('.').pop()
), tetapi Anda masih bisa mendapatkan kesalahan;sumber
Ini mungkin bekerja untuk Anda:
menjalankan foo () akan menampilkan "foo" atau tidak terdefinisi jika Anda menelepon dari fungsi anonim.
Ia bekerja dengan konstruktor juga, dalam hal ini akan menampilkan nama konstruktor panggilan (misalnya "Foo").
Info lebih lanjut di sini: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/Caller
Mereka mengklaim itu tidak standar, tetapi juga didukung oleh semua browser utama: Firefox, Safari, Chrome, Opera dan IE.
sumber
Kamu tidak bisa Fungsi tidak memiliki nama sesuai dengan standar (meskipun mozilla memiliki atribut seperti itu) - mereka hanya dapat ditugaskan ke variabel dengan nama.
Juga komentar Anda:
ada di dalam fungsi my.namespace.myFunc.getFn
Yang bisa Anda lakukan adalah mengembalikan konstruktor dari objek yang dibuat oleh yang baru
Jadi bisa dibilang begitu
sumber
Anda dapat menggunakan ini, untuk browser yang mendukung Error.stack (tidak hampir semua, mungkin)
tentu saja ini untuk fungsi saat ini, tetapi Anda mendapatkan ide.
senang ngiler sambil kode
sumber
Anda dapat menggunakan
name
properti untuk mendapatkan nama fungsi, kecuali jika Anda menggunakan fungsi anonimSebagai contoh:
sekarang mari kita coba dengan fungsi bernama
sekarang kamu bisa menggunakannya
sumber
Anda dapat menggunakan nama konstruktor seperti:
kode ini hanya mengembalikan nama metode.
sumber
sebagai bagian karena
ECMAScript 6
Anda dapat menggunakan metode Function.namesumber
Anda bisa menggunakan
Function.name
:Di sebagian besar implementasi JavaScript, setelah Anda memiliki referensi konstruktor di lingkup, Anda bisa mendapatkan nama stringnya dari properti namanya (mis. Function.name, atau Object.constructor.name
Anda bisa menggunakan
Function.callee
:arguments.caller
Metode asli sudah tidak digunakan lagi, tetapi sebagian besar browser mendukungFunction.caller
, yang akan mengembalikan objek pemanggilan yang sebenarnya (isi kodenya): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ Fungsi / pemanggil? Redirectlocale = id-AS & redirectslug = JavaScript% 2Fileferensi% 2FGlobal_Objects% 2Fungsi% 2FcallerAnda dapat membuat peta sumber :
Jika yang Anda butuhkan adalah tanda tangan fungsi literal ("nama" itu) dan bukan objek itu sendiri, Anda mungkin harus menggunakan sesuatu yang sedikit lebih dikustomisasi, seperti membuat referensi array dari nilai string API yang Anda perlu akses sering. Anda dapat memetakannya bersama-sama menggunakan
Object.keys()
dan rangkaian string Anda, atau melihat ke perpustakaan peta sumber Mozilla di GitHub, untuk proyek yang lebih besar: https://github.com/mozilla/source-mapsumber
Saya tahu ini adalah pertanyaan lama tetapi akhir-akhir ini saya telah menghadapi beberapa masalah serupa ketika mencoba untuk menghias beberapa metode Komponen React, untuk keperluan debugging. Seperti yang sudah dikatakan orang,
arguments.caller
danarguments.callee
dilarang dalam mode ketat yang mungkin diaktifkan secara default di React transpiling Anda. Anda dapat menonaktifkannya, atau saya dapat membuat hack lain, karena dalam Bereaksi semua fungsi kelas diberi nama, Anda sebenarnya dapat melakukan ini:sumber
Ini berhasil untuk saya.
Kode uji:
sumber
Saya memiliki masalah yang sama dan saya menyelesaikannya sebagai berikut:
Kode ini mengimplementasikan, dengan cara yang lebih nyaman, satu jawaban yang sudah saya baca di sini di bagian atas diskusi ini. Sekarang saya memiliki fungsi anggota mengambil nama objek fungsi apa pun. Ini skrip lengkapnya ...
sumber
Jika saya mengerti apa yang ingin Anda lakukan, ini adalah apa yang saya lakukan di dalam konstruktor fungsi.
sumber
Ini akan bekerja di ES5, ES6, semua browser dan fungsi mode ketat.
Begini tampilannya dengan fungsi bernama.
Begini tampilannya dengan fungsi anonim.
sumber
at myName (<anonymous>:2:15)
Firefox:@debugger eval code:3:3
lihat di sini: http://www.tek-tips.com/viewthread.cfm?qid=1209619
tampaknya tepat untuk kebutuhan Anda.
sumber
Anda dapat menggunakan Error.stack untuk melacak nama fungsi dan posisi persis di mana Anda berada di dalamnya.
Lihat stacktrace.js
sumber
Cara mudah untuk mendapatkan nama fungsi dari dalam fungsi yang Anda jalankan.
sumber
this
itu pada dasarnya bisa apa saja. coba(function(){console.log(this.name);}).bind({name: "put basically anything here even an object maybe a 1TB string maybe a class definition"})()