Я знаю, що в PHP можливо мати "змінні" змінні. Наприклад
$x = "variable";
$$x = "hello, world!";
echo $variable; // displays "hello, world!"
Чи можна посилатися на змінну за її назвою як рядок у javascript? Як би це було зроблено?
Я знаю, що в PHP можливо мати "змінні" змінні. Наприклад
$x = "variable";
$$x = "hello, world!";
echo $variable; // displays "hello, world!"
Чи можна посилатися на змінну за її назвою як рядок у javascript? Як би це було зроблено?
Відповіді:
Єдиного рішення для цього немає (ну, є eval
, але давайте серйозно не розглядати це). Можна отримати доступ до деяких глобальних змінних динамічно через window
, але це не працює для змінних, локальних для функції. Глобальні змінні, які не стають властивістю, - window
це змінні, визначені за допомогою let
і const
, та class
es.
Майже завжди є краще рішення, ніж використання змінних змінних! Натомість вам слід переглянути структуру даних і вибрати правильну для вашої проблеми.
Якщо у вас є фіксований набір імен, наприклад
// BAD
var foo = 42;
var bar = 21;
var key = 'foo';
console.log(eval(key));
збережіть ці імена / значення як властивості об'єкта та використовуйте позначення дужок, щоб динамічно їх шукати:
// GOOD
var obj = {
foo: 42,
bar: 21,
};
var key = 'foo';
console.log(obj[key]);
У ES2015 + це ще простіше зробити для існуючих змінних, використовуючи стислі позначення властивостей :
// GOOD
var foo = 42;
var bar = 21;
var obj = {foo, bar};
var key = 'foo';
console.log(obj[key]);
Якщо у вас є "послідовно" пронумеровані змінні, наприклад
// BAD
var foo1 = 'foo';
var foo2 = 'bar';
var foo3 = 'baz';
var index = 1;
console.log(eval('foo' + index));
то вам слід використовувати масив замість цього та просто використовувати індекс для доступу до відповідного значення:
// GOOD
var foos = ['foo', 'bar', 'baz'];
var index = 1;
console.log(foos[index - 1]);
Якщо ви відчайдушно робите це, ви можете спробувати скористатися eval ():
var data = "testVariable";
eval("var temp_" + data + "=123;");
alert(temp_testVariable);
Або використовуючи об’єкт вікна:
var data = "testVariable";
window["temp_" + data] = 123;
alert(window["temp_" + data]);
http://www.hiteshagrawal.com/javascript/dynamic-variables-in-javascript
eval
не може створити локальні змінні в суворому режимі. Однак непрямий виклик може створювати глобальні змінні.
Для посилання на змінну в JavaScript лише з рядком, ви можете використовувати
window['your_variable_name']
Ви також можете встановлювати та посилати змінні, а також об'єкти в змінних.
На відміну від PHP, JavaScript не пропонує доступ до глобального масиву (який містить посилання на всі задекларовані в даний час імена). Як такий, JavaScript не пропонує вбудовану підтримку змінних змінних. Однак ви можете імітувати цю функцію до тих пір, поки не визначите всі змінні як частина масиву чи об'єкта. Це, в свою чергу, створить для вас масив gloabls. Наприклад, замість того, щоб оголосити змінну hello
в глобальній області таким чином:
var hello = 'hello world';
давайте інкапсулюємо його всередині об'єкта. Ми будемо називати цей об'єкт vv (змінні змінні):
var vv = {
'hello': 'hello world',
//Other variable variables come here.
},
referToHello = 'hello';
Тепер ми можемо звернутися до змінної за її індексом, і оскільки індекси масиву можна надати за допомогою змінної, ми фактично використовуємо змінну змінної:
console.log(vv[referToHello]); //Output: hello world
Відповідь на ваше запитання
Давайте застосуємо це до коду, який ви вказали в оригінальному запитанні:
var vv = {
'x': 'variable',
'variable': 'hello world!'
};
console.log(vv[vv['x']]); //Displays "hello, world!"
Практичне використання
Хоча попередній код може виглядати смішно громіздким і непрактичним, у практичному використанні змінних змінних в JavaScript є практичне використання, використовуючи цей тип інкапсуляції. У наведеному нижче прикладі ми використовуємо ту саму концепцію, щоб отримати ідентифікатор невизначеної кількості елементів HTML.
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);
});
Цей приклад оголошує змінні змінних (ключі в elementIds
) на основі ідентифікатора кожного елемента і призначить вузол згаданого елемента як значення кожної змінної. А оскільки використання глобальних змінних у JavaScript, як правило, не рекомендує надавати змінним змінним унікальний обсяг (у цьому випадку, оголошуючи їх всередині elementIds
масиву), є не лише акуратним, але й більш відповідальним.
Звичайно, можна, але ні. Змінні повинні бути глобальними.
var killingFunction = 'alert'
var killMeNow = 'please'
var please = 'You have been killed!'
this[killingFunction](this[killMeNow])
Ви можете використовувати функцію JavaScript eval(str)
.
Ця функція - це перетворити рядок, наданий у JS-код, а потім виконати його.
Наприклад:
eval("console.log('hello world')"); // Logs hello world
Отже, щоб використовувати його як змінну, можна зробити наступне:
var a = "hello";
var hello = "world";
console.log(a + " " + eval(a)); // Logs hello world
Це дасть такий самий вихід, як:
console.log(a + " " + hello); // Logs hello world
(Приклад взято з посібника PHP щодо змінних змінних .)