2019
TL; DR
eval
оператор может запустить строковое выражение в вызываемом контексте и вернуть переменные из этого контекста; literal object
теоретически может сделать это записью: {[varName]}
, но он заблокирован по определению.
Итак, я сталкиваюсь с этим вопросом, и все здесь просто играют, не предлагая реального решения.но у @Axel Heider хороший подход.
Решение - eval
.почти самый забытый оператор.(наиболее вероятно, что оператор with()
)
eval
может динамически запускать выражение в вызываемом им контексте.и вернуть результат этого выражения.мы можем использовать это для динамического возврата значения переменной в контексте функции.
пример:
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
Обратите внимание, что я всегда пишу явно, выражение eval
будет выполняться.Чтобы избежать ненужных сюрпризов в коде.eval
очень сильный Но я уверен, что вы уже знаете, что
Кстати, если бы это было законно, мы могли бы использовать literal object
для захвата имени и значения переменной, но мы не можем объединитьК сожалению, сокращенные имена и значения вычисляемых свойств недействительны
functopn example( varName ){
var var1 = 'foo', var2 ='bar'
var capture = {[varName]}
}
example('var1') //trow 'Uncaught SyntaxError: Unexpected token }`