В PHP вы можете делать удивительные / ужасные вещи, как это:
$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1
Есть ли способ сделать что-то подобное с Javascript?
Например, если у меня есть, var name = 'the name of the variable';
я могу получить ссылку на переменную с именем name
?
javascript
dynamic-variables
Finbarr
источник
источник
Ответы:
Поскольку ECMA- / Javascript - это все
Objects
иContexts
(которые также являются некими объектами), каждая переменная хранится в так называемой переменной (или в случае функции, объекта активации). ).Так что если вы создаете переменные, как это:
В глобальной области видимости (= НЕТ контекста функции) вы неявно записываете эти переменные в глобальный объект (=
window
в браузере).К ним можно получить доступ, используя обозначение «точка» или «скобка»:
или
Это работает только для глобального объекта в данном конкретном случае, так как переменная объекта из глобального объекта является
window
самим объектом. В контексте функции у вас нет прямого доступа к объекту активации . Например:new
создает новый экземпляр самоопределяемого объекта (контекста). Безnew
объема функции также будетglobal
(= окно). Этот пример предупредитundefined
и1
соответственно. Если бы мы заменилиthis.a = 1; this.b = 2
на:Оба выхода оповещения будут неопределенными. В этом сценарии переменные
a
иb
будут храниться в объекте активации, изfoobar
которого мы не можем получить доступ (конечно, мы можем получить доступ к ним напрямую, вызвавa
иb
).источник
eval
это один из вариантов.источник
Вы можете использовать объект окна, чтобы добраться до него.
window
имеет ссылку на все глобальные переменные и глобальные функции, которые вы используете.источник
Просто не знаю, какой плохой ответ набирает столько голосов. Это довольно простой ответ, но вы делаете его сложным.
источник
this
» - если вы хотите получить доступ к глобальной переменной таким способом, лучше быть явным и использоватьwindow
объект, а неthis
.this
неоднозначно.this
или что-либо еще, для доступа к переменнойtype
из вашего примера, если у вас есть имя в другой переменной:function test(vname) { var type = 'article'; this[vname] = 'something else'; alert(type); }; test('type')
покажетarticle
, а неsomething else
. И это то, что объясняет «сложный ответ».Попробуй это...
источник
Это пример:
Другой пример :
Таким образом, значение « кокос » myVariable становится переменной кокос .
Потому что все переменные в глобальной области видимости являются свойствами объекта Window.
источник
В Javascript вы можете использовать тот факт, что все свойства являются парами ключ-значение. Энди уже упоминал об этом, но я не думаю, что его ответ показывает, как его можно использовать.
Обычно вы не пытаетесь создать переменную для хранения имени переменной, но пытаетесь сгенерировать имена переменных и затем использовать их. PHP делает это с помощью
$$var
нотации, но Javascript не нужен, потому что ключи свойств взаимозаменяемы с ключами массива.дает 123. Обычно вы хотите построить переменную, поэтому существует косвенное направление, поэтому вы можете сделать это и наоборот.
источник
2019
TL; DR
eval
оператор может запустить строковое выражение в контексте, который он вызвал, и вернуть переменные из этого контекста;literal object
Теоретически это можно сделать с помощью write:,{[varName]}
но оно заблокировано по определению.Поэтому я сталкиваюсь с этим вопросом, и все здесь просто играют, не предлагая реального решения. но у @Axel Heider хороший подход.
Решение есть
eval
. почти самый забытый оператор. (думаю, что большинство из нихwith()
)eval
Оператор может динамически запускать выражение в контексте, который он вызвал. и вернуть результат этого выражения. мы можем использовать это, чтобы динамически возвращать значение переменной в контексте функции.пример:
Обратите внимание, что я всегда пишу явно, выражение
eval
будет выполняться. Чтобы избежать ненужных сюрпризов в коде.eval
очень сильный, но я уверен, что вы уже знаете, чтоКстати, если бы это было законно, мы могли бы использовать
literal object
для захвата имени и значения переменной, но мы не можем объединить сокращенные имена и значение свойства, к сожалению, недопустимоисточник
Если вы не хотите использовать глобальный объект, такой как окно или глобальный (узел), вы можете попробовать что-то вроде этого:
источник
Мне нужно было нарисовать несколько FormData на лету, и способ объекта работал хорошо
Затем в моих циклах мне нужно было создать данные формы, которые я использовал
источник
Это альтернатива для тех, кому нужно экспортировать переменную с динамическим именем
Другая альтернатива - просто создать объект, ключи которого называются динамически.
источник
что они имеют в виду, нет, вы не можете. нет способа сделать это. так что можно было сделать что-то вроде этого
иметь функцию создания, аналогичную той, что реализована в ECMAScript 5.
источник
eval
операторeval () не работал в моих тестах. Но добавление нового кода JavaScript в дерево DOM возможно. Итак, вот функция, которая добавляет новую переменную:
источник
var node_head = document.getElementsByTagName("head")[0]
вместо ID, так как никто не дает оценкуid="head"
для<head>
:-)Хотя у этого есть принятый ответ, я хотел бы добавить наблюдение:
В ES6 использование
let
не работает :Однако использование
var
работаетЯ надеюсь, что это может быть полезно для некоторых.
источник
const
const vars = { t, m, b }; console.log(vars['b'])
. Иначеeval
тоже работает.использовать объект тоже здорово.
источник