Apakah mungkin untuk melakukan ini:
myfile.js:
function foo() {
alert(<my-function-name>);
// pops-up "foo"
// or even better: "myfile.js : foo"
}
Saya punya kerangka Dojo dan jQuery di tumpukan saya, jadi jika salah satu dari mereka membuatnya lebih mudah, mereka tersedia.
javascript
jquery
dojo
Sprugman
sumber
sumber
arguments.callee
adalah tidak diperbolehkan dalam mode ketat.Untuk fungsi non-anonim
Tetapi dalam kasus penangan kesalahan hasilnya adalah nama fungsi penangan kesalahan, bukan?
sumber
Semua yang Anda butuhkan sederhana. Buat fungsi:
Setelah itu kapan pun Anda butuhkan, Anda cukup menggunakan:
sumber
function getFuncName() { return getFuncName.name }
getFuncName
daripada nama pemanggilnya.Menurut MDN
Sebagaimana dicatat ini berlaku hanya jika skrip Anda menggunakan "mode ketat". Ini terutama karena alasan keamanan dan sayangnya saat ini tidak ada alternatif untuk ini.
sumber
Ini harus dilakukan:
Untuk penelepon, gunakan saja
caller.toString()
.sumber
[
Ini harus masuk dalam kategori "peretasan terjelek di dunia", tapi begini saja.
Pertama-tama, mencetak nama fungsi saat ini (seperti pada jawaban lain) tampaknya memiliki penggunaan terbatas bagi saya, karena Anda semacam sudah tahu apa fungsinya!
Namun, mengetahui nama fungsi panggilan bisa sangat berguna untuk fungsi penelusuran. Ini dengan regexp, tetapi menggunakan indexOf sekitar 3x lebih cepat:
sumber
Inilah cara yang akan berhasil:
Kemudian dalam tes Anda:
Perhatikan bahwa tes ketiga hanya akan berfungsi jika tes terletak di / util / functions
sumber
The
getMyName
fungsi dalam potongan bawah kembali nama fungsi menelepon. Ini hack dan bergantung pada non-standar fitur:Error.prototype.stack
. Perhatikan bahwa format string yang dikembalikan olehError.prototype.stack
diimplementasikan secara berbeda di mesin yang berbeda, jadi ini mungkin tidak akan berfungsi di mana-mana:Tentang solusi lain:
arguments.callee
tidak diperbolehkan dalam mode ketat danFunction.prototype.caller
merupakan non-standar dan tidak diperbolehkan dalam mode ketat .sumber
Kasing penggunaan lain bisa berupa acara dispatcher yang terikat saat runtime:
Keuntungannya di sini adalah operator dapat dengan mudah digunakan kembali dan tidak harus menerima antrian pengiriman sebagai argumen, alih-alih itu tersirat dengan nama doa ...
Pada akhirnya, kasus umum yang disajikan di sini adalah "menggunakan nama fungsi sebagai argumen sehingga Anda tidak harus meneruskannya secara eksplisit", dan itu bisa berguna dalam banyak kasus, seperti jquery animate () callback opsional, atau dalam callback timeout / interval, (yaitu Anda hanya melewati NAMA funcion).
sumber
Nama fungsi saat ini dan bagaimana hal itu dapat diperoleh tampaknya telah berubah selama 10 tahun terakhir, sejak pertanyaan ini diajukan.
Sekarang, bukan menjadi pengembang web pro yang tahu tentang semua sejarah semua browser yang pernah ada, di sini adalah cara kerjanya untuk saya di browser chrome 2019:
Beberapa jawaban lain mengalami beberapa kesalahan chrome tentang kode javascript yang ketat dan yang lainnya.
sumber
Karena Anda telah menulis fungsi bernama
foo
dan Anda tahu itumyfile.js
mengapa Anda perlu mendapatkan informasi ini secara dinamis?Bahwa menjadi kata Anda dapat menggunakan
arguments.callee.toString()
di dalam fungsi (ini adalah representasi string dari seluruh fungsi) dan regex nilai dari nama fungsi.Berikut adalah fungsi yang akan memunculkan namanya sendiri:
sumber
Kombinasi dari beberapa tanggapan yang saya lihat di sini. (Diuji dalam FF, Chrome, IE11)
Memanggil randomFunction () akan mengingatkan string yang berisi nama fungsi.
Demo JS Fiddle: http://jsfiddle.net/mjgqfhbe/
sumber
Jawaban yang diperbarui untuk ini dapat ditemukan di jawaban ini: https://stackoverflow.com/a/2161470/632495
dan, jika Anda tidak ingin mengklik:
sumber
Informasi aktual pada tahun 2016 tahun.
Hasil untuk deklarasi fungsi
Hasil di Opera
Menghasilkan Chrome
Menghasilkan NodeJS
Tidak berfungsi di Firefox. Belum diuji pada IE dan Edge.
Hasil untuk ekspresi fungsi
Menghasilkan NodeJS
Menghasilkan Chrome
Tidak berfungsi di Firefox, Opera. Belum diuji pada IE dan Edge.
Catatan:
sumber
Variasi naskah:
Catatan hanya tersedia di mesin yang sesuai dengan ES6 / ES2015. Untuk lebih banyak lihat
sumber
Ini satu liner:
Seperti ini:
sumber
Ini varian dari jawaban Igor Ostroumov :
Jika Anda ingin menggunakannya sebagai nilai default untuk suatu parameter, Anda perlu mempertimbangkan panggilan tingkat kedua ke 'pemanggil':
Ini secara dinamis akan memungkinkan implementasi yang dapat digunakan kembali dalam berbagai fungsi.
Jika Anda ingin nama file juga, berikut adalah solusi menggunakan jawaban dari F-3000 pada pertanyaan lain:
sumber
Mencoba:
sumber
Jawabannya singkat:
alert(arguments.callee.name);
sumber