Di PHP Anda dapat melakukan hal-hal luar biasa / mengerikan seperti ini:
$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1
Apakah ada cara melakukan hal seperti ini dengan Javascript?
Misal jika saya punya, var name = 'the name of the variable';
bisakah saya mendapatkan referensi ke variabel dengan nama name
?
javascript
dynamic-variables
Finbarr
sumber
sumber
Jawaban:
Karena ECMA- / Javascript adalah semua tentang
Objects
danContexts
(yang, juga merupakan objek dari Object), setiap variabel disimpan dalam variabel yang disebut Variable- (atau dalam hal Function, Activation Object ).Jadi jika Anda membuat variabel seperti ini:
Dalam lingkup Global (= NO konteks fungsi), Anda secara implisit menulis variabel-variabel tersebut ke objek Global (=
window
dalam browser).Itu dapat diakses dengan menggunakan notasi "dot" atau "bracket":
atau
Ini hanya bekerja untuk obyek global dalam contoh khusus ini, karena Obyek Variabel dari Object global adalah
window
objek itu sendiri. Dalam Konteks fungsi, Anda tidak memiliki akses langsung ke Objek Aktivasi . Contohnya:new
menciptakan instance baru dari objek yang didefinisikan sendiri (konteks). Tanpanew
ruang lingkup fungsi akan jugaglobal
(= window). Contoh ini akan mengingatkanundefined
dan1
masing - masing. Jika kami akan menggantithis.a = 1; this.b = 2
dengan:Kedua keluaran peringatan akan tidak ditentukan. Dalam skenario itu, variabel
a
danb
akan disimpan di Objek Aktivasi darifoobar
, yang tidak dapat kita akses (tentu saja kita dapat mengaksesnya secara langsung dengan menelepona
danb
).sumber
eval
adalah salah satu pilihan.sumber
Anda dapat menggunakan objek jendela untuk mendapatkannya.
window
memiliki referensi ke semua variabel global dan fungsi global yang Anda gunakan.sumber
Hanya tidak tahu jawaban buruk apa yang mendapat begitu banyak suara. Ini jawaban yang cukup mudah tetapi Anda membuatnya rumit.
sumber
this
" - Jika Anda ingin mengakses variabel global dengan cara ini, lebih baik untuk eksplisit dan menggunakanwindow
objek, bukanthis
.this
ambigu.this
, atau apa pun, untuk mengakses variabeltype
dari contoh Anda, jika Anda memiliki namanya di variabel lain:function test(vname) { var type = 'article'; this[vname] = 'something else'; alert(type); }; test('type')
akan ditampilkanarticle
, tidaksomething else
. Dan itulah yang dijelaskan "jawaban kompleks".Coba ini...
sumber
Ini adalah sebuah contoh:
Contoh lain :
Jadi, nilai " coco " dari myVariable menjadi variabel coco .
Karena semua variabel dalam lingkup global adalah properti dari objek Window.
sumber
Dalam Javascript Anda dapat menggunakan fakta bahwa semua properti adalah pasangan nilai kunci. jAndy sudah menyebutkan ini, tapi saya pikir jawabannya tidak menunjukkan bagaimana itu bisa dieksploitasi.
Biasanya Anda tidak mencoba membuat variabel untuk menyimpan nama variabel tetapi mencoba untuk menghasilkan nama variabel dan kemudian menggunakannya. PHP melakukannya dengan
$$var
notasi tetapi Javascript tidak perlu karena kunci properti dapat dipertukarkan dengan kunci array.memberikan 123. Biasanya Anda ingin membangun variabel yang mengapa ada tipuan sehingga Anda juga bisa melakukannya sebaliknya.
sumber
2019
TL; DR
eval
operator dapat menjalankan ekspresi string dalam konteks yang dipanggil dan mengembalikan variabel dari konteks itu;literal object
secara teoritis dapat melakukannya dengan menulis:,{[varName]}
tetapi diblokir oleh definisi.Jadi saya menemukan pertanyaan ini dan semua orang di sini hanya bermain-main tanpa membawa solusi nyata. tapi @Axel Heider memiliki pendekatan yang bagus.
Solusinya adalah
eval
. operator yang hampir terlupakan. (Berpikir kebanyakan adalahwith()
)eval
Operator dapat secara dinamis menjalankan ekspresi dalam konteks yang disebutnya. dan kembalikan hasil dari ekspresi itu. kita dapat menggunakannya untuk mengembalikan nilai variabel secara dinamis dalam konteks fungsi.contoh:
Perhatikan bahwa saya selalu menulis secara eksplisit ekspresi
eval
akan berjalan. Untuk menghindari kejutan yang tidak perlu dalam kode.eval
sangat kuat Tapi saya yakin Anda sudah tahu ituBTW, jika itu legal, kita dapat menggunakan
literal object
untuk menangkap nama variabel dan nilai, tetapi kita tidak dapat menggabungkan nama properti yang dihitung dan singkatan nilai properti, sayangnya, tidak validsumber
Jika Anda tidak ingin menggunakan objek global seperti jendela atau global (simpul), Anda dapat mencoba sesuatu seperti ini:
sumber
Saya perlu menggambar beberapa FormData dengan cepat dan cara objek bekerja dengan baik
Kemudian di loop saya di mana pun saya perlu membuat data formulir yang saya gunakan
sumber
Ini adalah alternatif bagi mereka yang perlu mengekspor variabel yang dinamai secara dinamis
Alternatif lain adalah dengan hanya membuat objek yang kuncinya dinamai secara dinamis
sumber
apa yang mereka maksudkan adalah tidak, Anda tidak bisa. tidak ada cara untuk menyelesaikannya. jadi mungkin saja kamu bisa melakukan hal seperti ini
memiliki fungsi create sama seperti yang diterapkan pada ECMAScript 5.
sumber
eval
operatoreval () tidak berfungsi dalam pengujian saya. Tetapi menambahkan kode JavaScript baru ke pohon DOM adalah mungkin. Jadi di sini adalah fungsi yang menambahkan variabel baru:
sumber
var node_head = document.getElementsByTagName("head")[0]
bukan ID, karena tidak ada yang memberikanid="head"
untuk<head>
:-)Meskipun ini memiliki jawaban yang diterima, saya ingin menambahkan pengamatan:
Dalam ES6 menggunakan
let
tidak berfungsi :Namun menggunakan
var
karyaSaya harap ini bermanfaat bagi sebagian orang.
sumber
const
const vars = { t, m, b }; console.log(vars['b'])
. Jika tidakeval
berfungsi juga.gunakan Object juga bagus.
sumber