Apakah ada cara untuk mendapatkan semua variabel yang saat ini dalam cakupan di javascript?
javascript
Ian
sumber
sumber
for (v in this) alert(v);
. Tidak semua global bisa dihitung, dan saya tahu tidak ada cara standar untuk mendapatkan daftar yang tidak dapat dihitung.this
,arguments
, parameter dan semua variabel yang didefinisikan dalam melampirkan lingkup.Jawaban:
Tidak. Variabel "Dalam lingkup" ditentukan oleh "rantai lingkup", yang tidak dapat diakses secara programatis.
Untuk detail (cukup banyak), lihat spesifikasi ECMAScript (JavaScript). Berikut ini tautan ke halaman resmi tempat Anda dapat mengunduh spesifikasi kanonik (PDF), dan ini satu ke versi HTML resmi yang dapat ditautkan.
Perbarui berdasarkan komentar Anda ke Camsoft
Variabel dalam ruang lingkup untuk fungsi acara Anda ditentukan oleh tempat Anda menentukan fungsi acara, bukan bagaimana mereka menyebutnya. Tapi , Anda dapat menemukan informasi berguna tentang apa yang tersedia untuk fungsi Anda melalui
this
dan argumen dengan melakukan sesuatu di sepanjang garis yang ditunjukkan KennyTM (for (var propName in ____)
) karena itu akan memberi tahu Anda apa yang tersedia pada berbagai objek yang disediakan untuk Anda (this
dan argumen; jika Anda tidak yakin argumen apa yang mereka berikan kepada Anda, Anda dapat mencari tahu melaluiarguments
variabel yang didefinisikan secara implisit untuk setiap fungsi).Jadi selain apa pun yang ada di ruang lingkup karena di mana Anda mendefinisikan fungsi Anda, Anda dapat mengetahui apa lagi yang tersedia dengan cara lain dengan melakukan:
(Anda dapat mengembangkannya untuk mendapatkan informasi yang lebih bermanfaat.)
Alih-alih, saya mungkin menggunakan debugger seperti alat dev Chrome (bahkan jika Anda biasanya tidak menggunakan Chrome untuk pengembangan) atau Firebug (bahkan jika Anda biasanya tidak menggunakan Firefox untuk pengembangan), atau Dragonfly on Opera , atau "Alat Pengembang F12" di IE. Dan baca semua file JavaScript yang mereka berikan kepada Anda. Dan mengalahkan mereka di atas kepala untuk dokumen yang tepat. :-)
sumber
Meskipun semua orang menjawab " Tidak " dan saya tahu bahwa "Tidak" adalah jawaban yang tepat tetapi jika Anda benar-benar perlu mendapatkan variabel lokal dari suatu fungsi ada cara terbatas.
Pertimbangkan fungsi ini:
Anda dapat mengubah fungsi Anda menjadi string:
Anda akan mendapatkan sumber fungsi sebagai string
Sekarang Anda dapat menggunakan parser seperti esprima untuk mengurai kode fungsi dan menemukan deklarasi variabel lokal.
dan temukan benda dengan:
dalam hasilnya (saya telah menghapus di
console.log(x)
bawah):Saya telah menguji ini di Chrome, Firefox dan Node.
Tetapi masalah dengan metode ini adalah Anda hanya memiliki variabel yang didefinisikan dalam fungsi itu sendiri. Misalnya untuk yang ini:
Anda hanya memiliki akses ke x dan bukan y . Tetapi Anda masih dapat menggunakan rantai pemanggil (arguments.callee.caller.caller.caller) dalam satu lingkaran untuk menemukan variabel lokal fungsi pemanggil. Jika Anda memiliki semua nama variabel lokal, maka Anda memiliki variabel lingkup . Dengan nama variabel Anda memiliki akses ke nilai dengan eval sederhana.
sumber
function getCounter(start){ return function(){ start ++; return start; } } var counter = getCounter(1); var startInClosure = eval.call(counter, 'this.start;'); console.log(startInClosure);
Itu mencetakundefined
sementara saya berharap itu harus 2.Iya dan tidak. "Tidak" di hampir setiap situasi. "Ya," tetapi hanya secara terbatas, jika Anda ingin memeriksa ruang lingkup global. Ambil contoh berikut:
Output mana, di antara 150+ hal lainnya , berikut ini:
Jadi dimungkinkan untuk membuat daftar beberapa variabel dalam lingkup saat ini, tetapi tidak dapat diandalkan, ringkas, efisien, atau mudah diakses.
Pertanyaan yang lebih baik adalah mengapa Anda ingin tahu variabel apa yang ada dalam ruang lingkup?
sumber
for ( var i in window ) { if (window.hasOwnProperty(i)) { console.log(i, window[i]); }}
. Ini setidaknya akan mengurangi properti yang diwarisi dan variabel Anda hanya akan berada di antara sekitar 50 properti lainnya.Dalam ECMAScript 6 lebih atau kurang mungkin dengan membungkus kode di dalam
with
pernyataan dengan objek proxy. Catatan itu membutuhkan mode non-ketat dan itu praktik yang buruk.Proksi mengklaim memiliki semua pengidentifikasi yang dirujuk di dalam
with
, sehingga tugas variabel disimpan dalam target. Untuk pencarian, proksi mengambil nilai dari target proksi atau objek global (bukan lingkup induk).let
danconst
variabel tidak termasuk.Terinspirasi oleh jawaban ini oleh Bergi .
sumber
Kamu tidak bisa
Variabel, pengidentifikasi deklarasi fungsi dan argumen untuk kode fungsi, terikat sebagai properti dari Objek Variabel , yang tidak dapat diakses.
Lihat juga:
sumber
with
pernyataan dapat digunakan untuk memasukkan objek lain dalam rantai).Cara Termudah untuk Mendapatkan Akses ke Vars dalam Lingkup Tertentu
Catatan: Anda ingin melakukan ini terhadap js yang tidak dicincang.
Cara Termudah untuk Menampilkan Semua Vars Non-Pribadi
Sekarang Anda akan melihat pohon objek yang dapat Anda kembangkan dengan semua objek yang dideklarasikan.
sumber
Seperti yang semua orang perhatikan: Anda tidak bisa. Tetapi Anda dapat membuat obj dan menetapkan setiap var yang Anda nyatakan untuk obj itu. Dengan begitu Anda dapat dengan mudah memeriksa vars Anda:
sumber
console.log(window);
jsfiddle.net/4x3TxSaya membuat biola menerapkan (pada dasarnya) ide-ide di atas yang diuraikan oleh iman. Berikut ini tampilannya ketika Anda mengarahkan mouse ke ipsum kedua
return ipsum*ipsum - ...
Variabel yang berada dalam ruang lingkup disorot di mana mereka dideklarasikan (dengan warna berbeda untuk cakupan berbeda). Itu
lorem
bertepi merah adalah variabel Dibayangi (tidak dalam ruang lingkup, tetapi dalam lingkup jika lorem lainnya lebih bawah pohon tidak akan ada.)Saya menggunakan perpustakaan esprima untuk mem-parsing JavaScript, dan estraverse, escodegen, escope (perpustakaan utilitas di atas esprima.) 'Pengangkatan berat' dilakukan semua oleh perpustakaan-perpustakaan itu (tentu saja yang paling kompleks adalah esprima itu sendiri.)
Bagaimana itu bekerja
membuat pohon sintaksis abstrak. Kemudian,
menghasilkan struktur data yang kompleks merangkum informasi tentang semua ruang lingkup dalam program. Sisanya mengumpulkan informasi yang disandikan dalam objek analisis (dan pohon sintaksis abstrak itu sendiri), dan membuat skema pewarnaan interaktif darinya.
Jadi jawaban yang benar sebenarnya bukan "tidak", tapi "ya, tapi". "Tapi" yang besar: Anda pada dasarnya harus menulis ulang bagian penting dari browser chrome (dan itu devtools) di JavaScript. JavaScript adalah bahasa lengkap Turing, jadi tentu saja itu mungkin, pada prinsipnya. Yang tidak mungkin adalah melakukan semuanya tanpa menggunakan keseluruhan kode sumber Anda (sebagai string) dan kemudian melakukan hal-hal yang sangat kompleks dengan itu.
sumber
Jika Anda hanya ingin memeriksa variabel secara manual untuk membantu debug, jalankan saja debugger:
debugger;
Langsung ke konsol browser.
sumber