2019
TL; DR
eval
toán tử có thể chạy biểu thức chuỗi trong ngữ cảnh mà nó gọi và trả về các biến từ ngữ cảnh đó;
literal object
về mặt lý thuyết có thể làm điều đó bằng cách viết : {[varName]}
, nhưng nó bị chặn theo định nghĩa.
Vì vậy, tôi bắt gặp câu hỏi này và mọi người ở đây chỉ chơi xung quanh mà không mang lại một giải pháp thực sự. nhưng @Axel Heider có cách tiếp cận tốt.
Giải pháp là eval
. điều hành gần như bị lãng quên nhất. (nghĩ rằng hầu hết là một with()
)
eval
toán tử có thể tự động chạy biểu thức trong ngữ cảnh mà nó gọi. và trả về kết quả của biểu thức đó. chúng ta có thể sử dụng điều đó để tự động trả về giá trị của một biến trong ngữ cảnh của hàm.
thí dụ:
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
Lưu ý rằng tôi luôn viết rõ ràng biểu thức eval
sẽ chạy. Để tránh những bất ngờ không cần thiết trong mã. eval
rất mạnh
Nhưng tôi chắc rằng bạn đã biết điều đó rồi
BTW, nếu đó là hợp pháp, chúng tôi có thể sử dụng literal object
để nắm bắt tên và giá trị của biến, nhưng chúng tôi không thể kết hợp tên thuộc tính và giá trị tài sản tốc ký, đáng buồn thay, không hợp lệ
functopn example( varName ){
var var1 = 'foo', var2 ='bar'
var capture = {[varName]}
}
example('var1') //trow 'Uncaught SyntaxError: Unexpected token }`