2019
TL; DR
eval
operator może uruchamiać wyrażenie łańcuchowe w kontekście, który wywołuje i zwraca zmienne z tego kontekstu;
literal object
teoretycznie może to zrobić przez zapis:, {[varName]}
ale z definicji jest zablokowane.
Natrafiam więc na to pytanie i wszyscy tutaj bawią się bez rzeczywistego rozwiązania. ale @Axel Heider ma dobre podejście.
Rozwiązaniem jest eval
. prawie najbardziej zapomniany operator. (myślę, że większość z nich jest with()
)
eval
operator może dynamicznie uruchamiać wyrażenie w kontekście, który wywołał. i zwróć wynik tego wyrażenia. możemy tego użyć, aby dynamicznie zwrócić wartość zmiennej w kontekście funkcji.
przykład:
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
Zauważ, że zawsze piszę jawnie, wyrażenie eval
będzie działać. Aby uniknąć niepotrzebnych niespodzianek w kodzie. eval
jest bardzo silny,
ale jestem pewien, że już o tym wiesz
BTW, gdyby było to zgodne z prawem, moglibyśmy użyć literal object
do przechwycenia nazwy i wartości zmiennej, ale nie możemy łączyć obliczonych nazw właściwości i wartości nieruchomości w skrócie
functopn example( varName ){
var var1 = 'foo', var2 ='bar'
var capture = {[varName]}
}
example('var1') //trow 'Uncaught SyntaxError: Unexpected token }`