2019
TL; DR
eval
O operador pode executar a expressão de seqüência de caracteres no contexto chamado e retornar variáveis desse contexto;
literal object
teoricamente, podemos fazer isso escrevendo:, {[varName]}
mas bloqueado por definição.
Então, me deparei com essa pergunta e todos aqui brincam sem trazer uma solução real. mas @Axel Heider tem uma boa abordagem.
A solução é eval
. operador quase mais esquecido. (pense mais um with()
)
eval
O operador pode executar dinamicamente a expressão no contexto que chamou. e retorne o resultado dessa expressão. podemos usar isso para retornar dinamicamente o valor de uma variável no contexto da função.
exemplo:
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
Observe que eu sempre escrevo explicitamente que a expressão eval
será executada. Para evitar surpresas desnecessárias no código. eval
é muito forte,
mas tenho certeza que você já sabe disso
BTW, se fosse legal, poderíamos usar literal object
para capturar o nome e o valor da variável, mas não podemos combinar nomes de propriedades computados e valores abreviados de propriedades, infelizmente, são inválidos.
functopn example( varName ){
var var1 = 'foo', var2 ='bar'
var capture = {[varName]}
}
example('var1') //trow 'Uncaught SyntaxError: Unexpected token }`