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:
function exmaple1(){
var a = 1, b = 2, default = 3;
var name = 'a';
return eval(name)
}
example1() // return 1
function example2(option){
var a = 1, b = 2, defaultValue = 3;
switch(option){
case 'a': name = 'a'; break;
case 'b': name = 'b'; break;
default: name = 'defaultValue';
}
return eval (name);
}
example2('a') // return 1
example2('b') // return 2
example2() // return 3
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 itu
BTW, 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 valid
functopn example( varName ){
var var1 = 'foo', var2 ='bar'
var capture = {[varName]}
}
example('var1') //trow 'Uncaught SyntaxError: Unexpected token }`