2019
TL; DR
eval operator dapat menjalankan ekspresi string dalam konteks yang dipanggil dan mengembalikan variabel dari konteks itu;
literal objectsecara 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() )
evalOperator 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 evalakan berjalan. Untuk menghindari kejutan yang tidak perlu dalam kode. evalsangat kuat
Tapi saya yakin Anda sudah tahu itu
BTW, jika itu legal, kita dapat menggunakan literal objectuntuk 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 }`