2019
TL; DR
eval
оператор может запустить строковое выражение в контексте, который он вызвал, и вернуть переменные из этого контекста;
literal object
Теоретически это можно сделать с помощью write:, {[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 }`