Saya menggunakan yang berikut ini untuk mendapatkan nama fungsi pemanggil JavaScript:
var callerFunc = arguments.callee.caller.toString();
callerFuncName = (callerFunc.substring(callerFunc.indexOf("function") + 8, callerFunc.indexOf("(")) || "anoynmous")
Adakah cara untuk menemukan nomor baris dari mana metode itu dipanggil?
Juga, apakah ada cara untuk mendapatkan nama file JavaScript dari mana metode itu dipanggil? Atau URL sumbernya?
javascript
Tal
sumber
sumber
Jawaban:
Ini berfungsi untuk saya di chrome / QtWebView
sumber
var caller_line = (new Error).stack.split("\n")[4]
solusi kangax memperkenalkan lingkup coba..catch yang tidak perlu. Jika Anda perlu mengakses nomor baris sesuatu di JavaScript (selama Anda menggunakan Firefox atau Opera), cukup akses
(new Error).lineNumber
.sumber
Saya terkejut bahwa sebagian besar jawaban ini berasumsi bahwa Anda ingin menangani kesalahan daripada hanya menampilkan jejak debug yang bermanfaat untuk kasus normal juga.
Misalnya, saya suka menggunakan
console.log
pembungkus seperti ini:Ini akhirnya mencetak output seperti berikut ke konsol saya:
1462567104174 [getAllPosts@http://me.com/helper.js:362:9]
Lihat https://stackoverflow.com/a/27074218/ dan juga Pembungkus yang tepat untuk console.log dengan nomor baris yang benar?
sumber
Ini sering kali dicapai dengan melemparkan kesalahan dari konteks saat ini; kemudian menganalisis objek kesalahan untuk properti seperti
lineNumber
danfileName
(yang dimiliki beberapa browser)Jangan lupa bahwa
callee.caller
properti sudah usang (dan tidak pernah benar-benar ada di ECMA edisi ke-3 sejak awal).Ingat juga bahwa dekompilasi fungsi ditetapkan sebagai ketergantungan implementasi sehingga mungkin menghasilkan hasil yang tidak terduga. Saya menulis tentang itu di sini dan di sini .
sumber
callee.caller
.line
hanya mengisi ketika kesalahan terjadi.Sepertinya saya agak terlambat :), tetapi pembahasannya cukup menarik jadi .. ini dia ... Dengan asumsi Anda ingin membuat penangan kesalahan, dan Anda menggunakan kelas penangan pengecualian Anda sendiri seperti:
Dan Anda membungkus kode Anda seperti ini:
Kemungkinan besar Anda akan memiliki penangan kesalahan dalam file .js terpisah.
Anda akan melihat bahwa di firefox atau konsol kesalahan chrome, nomor baris kode (dan nama file) yang ditampilkan adalah baris (file) yang menampilkan pengecualian 'Kesalahan' dan bukan pengecualian 'errorHandler' yang benar-benar Anda inginkan untuk melakukan debugging mudah. Melempar pengecualian Anda sendiri itu bagus, tetapi pada proyek besar menemukannya bisa menjadi masalah, terutama jika mereka memiliki pesan yang serupa. Jadi, yang dapat Anda lakukan adalah meneruskan referensi ke objek Error kosong yang sebenarnya ke penangan kesalahan Anda, dan referensi tersebut akan menyimpan semua informasi yang Anda inginkan (misalnya di firefox Anda bisa mendapatkan nama file, dan nomor baris, dll. ; di chrome Anda mendapatkan sesuatu yang serupa jika Anda membaca properti 'stack' dari instance Error). Singkat cerita, Anda bisa melakukan sesuatu seperti ini:
Sekarang Anda bisa mendapatkan file aktual dan nomor baris yang memberikan pengecualian khusus kepada Anda.
sumber
Nomor baris sebenarnya adalah sesuatu yang statis, jadi jika Anda hanya menginginkannya untuk pencatatan maka nomor itu dapat diproses sebelumnya dengan sesuatu seperti gulp. Saya telah menulis plugin gulp kecil yang melakukan hal itu:
Ini akan melampirkan nama file dan baris ke semua log dari console.log, jadi
console.log(something)
akan menjadiconsole.log('filePath:fileNumber', something)
. Keuntungannya adalah sekarang Anda dapat menggabungkan file Anda, mentranspilasinya ... dan Anda masih akan mendapatkan barisnyasumber
Saya menyadari ini adalah pertanyaan lama tetapi sekarang ada metode yang disebut
console.trace("Message")
yang akan menunjukkan nomor baris dan rantai panggilan metode yang mengarah ke log bersama dengan pesan yang Anda sampaikan. Info lebih lanjut tentang trik javascript logging tersedia di sini di freecodecamp dan posting blog medium inisumber
Jika Anda ingin mengetahui nomor baris untuk tujuan debugging, atau hanya selama pengembangan (Untuk suatu alasan atau lainnya), Anda dapat menggunakan Firebug (ekstensi Firefox) dan membuat pengecualian.
Edit :
Jika Anda benar-benar perlu melakukan itu dalam produksi karena suatu alasan, Anda dapat melakukan pra-proses file javascript Anda agar setiap fungsi melacak baris tempat Anda berada. Saya tahu beberapa kerangka kerja yang menemukan cakupan kode menggunakan ini (seperti JSCoverage ).
Misalnya, panggilan awal Anda adalah:
Anda bisa menulis preprocessor untuk membuatnya menjadi:
Kemudian
y()
, Anda dapat menggunakanarguments.callee.caller.line
untuk mengetahui baris dari mana itu dipanggil, seperti:sumber
Beginilah cara saya melakukannya, saya telah mengujinya di Firefox dan Chrome. Ini memungkinkan untuk memeriksa nama file dan nomor baris dari tempat asal fungsi tersebut dipanggil.
sumber
Inilah yang saya tulis berdasarkan info yang ditemukan di forum ini:
Ini adalah bagian dari MyDebugNamespace, Debug tampaknya dicadangkan dan tidak akan berfungsi sebagai nama namespace.
...
...
Bagaimana cara menelepon:
Saya menyertakan dua fungsi dengan jumlah variabel argumen yang memanggil kode dasar ini di ruang nama saya sehingga secara opsional menghilangkan pesan atau kesalahan dalam panggilan.
Ini berfungsi dengan baik dengan Firefox, IE6 dan Chrome melaporkan nama file dan lineNumber sebagai tidak ditentukan.
sumber
kode berikut berfungsi untuk saya di Mozilla dan Chrome.
Fungsi log-nya yang menunjukkan nama file dan garis pemanggil.
sumber
SyntaxError: function statement requires a name,log: function (arg) {
Kontribusi saya pada kesalahan khusus di JavaScript:
Pertama, saya setuju dengan pria @BT ini di Mewarisi dari objek Error - di mana properti pesan? , kami harus membangunnya dengan benar (sebenarnya Anda harus menggunakan pustaka objek js, favorit saya: https://github.com/jiem/my-class ):
kemudian, kita harus mendefinisikan fungsi penanganan kesalahan global (opsional) atau, mereka akan berakhir ke mesin:
akhirnya, kita harus membuang kesalahan khusus kita dengan hati-hati:
Hanya saja, saat meneruskan parameter ketiga sebagai
new Error()
kita dapat melihat tumpukan dengan fungsi dan nomor baris!Pada 2, fungsi tersebut juga dapat menangani kesalahan yang dilemparkan oleh mesin juga.
Tentu saja, pertanyaan sebenarnya adalah apakah kita benar-benar membutuhkannya dan kapan; ada kasus (99% menurut saya) di mana pengembalian anggun
false
sudah cukup dan hanya menyisakan beberapa poin penting untuk ditampilkan dengan dilempar kesalahan.Contoh: http://jsfiddle.net/centurianii/m2sQ3/1/
sumber
Ini akan menunjukkan kepada Anda seluruh trek.
sumber
Untuk menentukan di baris mana ada sesuatu, Anda harus mencari semua kode untuk kode yang menempati baris minat tertentu dan menghitung karakter "\ n" dari atas ke yang menarik ini dan menambahkan 1.
Saya sebenarnya melakukan hal ini dalam aplikasi yang saya tulis. Ini adalah validator praktik terbaik untuk HTML dan masih dalam pengembangan, tetapi proses keluaran kesalahan yang Anda minati telah selesai.
http://mailmarkup.org/htmlint/htmlint.html
sumber
Jawabannya sederhana. Tidak dan Tidak (Tidak).
Pada saat javascript menjalankan konsep file / url sumber yang berasal sudah hilang.
Juga tidak ada cara untuk menentukan nomor baris karena sekali lagi pada saat eksekusi pengertian kode "baris" tidak lagi berarti di Javascript.
Implementasi khusus dapat menyediakan hook API untuk memungkinkan akses kode priviledged ke detail tersebut untuk tujuan debugging, tetapi API ini tidak diekspos ke kode Javascript standar biasa.
sumber