Không giống như PHP, JavaScript không cung cấp quyền truy cập vào mảng cầu nối (chứa các tham chiếu đến tất cả các tên biến hiện được khai báo). Do đó, JavaScript không cung cấp hỗ trợ gốc cho các biến biến. Tuy nhiên, bạn có thể mô phỏng tính năng này miễn là bạn xác định tất cả các biến của mình như một phần của một mảng hoặc một đối tượng. Điều này sẽ lần lượt tạo ra một mảng Gloabls cho bạn. Ví dụ: thay vì khai báo biến hello
trong phạm vi toàn cục như sau:
var hello = 'hello world';
hãy đóng gói nó bên trong một đối tượng. Chúng tôi sẽ gọi đối tượng đó là vv (biến biến):
var vv = {
'hello': 'hello world',
//Other variable variables come here.
},
referToHello = 'hello';
Bây giờ chúng ta có thể tham chiếu đến biến bằng chỉ mục của nó và vì các chỉ mục mảng có thể được cung cấp bằng cách sử dụng một biến nên trên thực tế, chúng ta đang sử dụng một biến biến:
console.log(vv[referToHello]); //Output: hello world
Câu trả lời cho câu hỏi của bạn
Hãy áp dụng điều này cho mã bạn đã cung cấp trong câu hỏi ban đầu:
var vv = {
'x': 'variable',
'variable': 'hello world!'
};
console.log(vv[vv['x']]); //Displays "hello, world!"
Sử dụng thực tế
Mặc dù đoạn mã trước đó có thể trông rất cồng kềnh và không thực tế, nhưng có những cách sử dụng thực tế cho các biến biến trong JavaScript bằng cách sử dụng kiểu đóng gói này. Trong ví dụ dưới đây, chúng tôi sử dụng cùng một khái niệm để lấy ID của một số phần tử HTML không xác định.
var elementIds = [],
elements = ['message','fillOrStroke','sizePicker','colorPicker']; //The items in this array could be defined automatically via an input, database query, event, etc.
elements.forEach( (element) => {
elementIds[element] = document.getElementById(element);
});
Ví dụ này khai báo các biến biến (khóa trong elementIds
) dựa trên ID của mỗi phần tử và sẽ gán nút của phần tử đã nói làm giá trị của mỗi biến. Và vì việc sử dụng các biến toàn cục trong JavaScript nói chung không được khuyến khích việc cung cấp cho các biến biến của bạn một phạm vi duy nhất (trong trường hợp này là khai báo chúng bên trong elementIds
mảng) không chỉ gọn gàng mà còn có trách nhiệm hơn.