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
дуже сильний
але я впевнений, що ви це вже знаєте
BTW, якщо це було законно, ми могли б використовувати literal object
для захоплення ім'я змінної та значення змінної, але ми не можемо поєднувати обчислені імена властивостей та скорочення значення властивості, на жаль, недійсне
functopn example( varName ){
var var1 = 'foo', var2 ='bar'
var capture = {[varName]}
}
example('var1') //trow 'Uncaught SyntaxError: Unexpected token }`