No PHP, você pode fazer coisas incríveis / horrendas como esta:
$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1
Existe alguma maneira de fazer algo assim com Javascript?
Por exemplo, se eu tiver um, var name = 'the name of the variable';
posso obter uma referência à variável com nome name
?
javascript
dynamic-variables
Finbarr
fonte
fonte
Respostas:
Como o ECMA- / Javascript tem tudo a ver
Objects
eContexts
(que também é um tipo de objeto), todas as variáveis são armazenadas em uma variável chamada variável- (ou no caso de uma função, objeto de ativação ).Portanto, se você criar variáveis como esta:
No escopo Global (= NO contexto da função), você escreve implicitamente essas variáveis no objeto Global (=
window
em um navegador).Esses podem ser acessados usando a notação "ponto" ou "colchete":
ou
Isso só funciona para o objeto global, neste caso particular, porque o objeto variável do objeto global é o
window
objeto em si. Dentro do contexto de uma função, você não tem acesso direto ao objeto de ativação . Por exemplo:new
cria uma nova instância de um objeto auto-definido (contexto). Semnew
o escopo da função seria tambémglobal
(= window). Este exemplo alertariaundefined
e1
respectivamente. Se substituirmosthis.a = 1; this.b = 2
por:Ambas as saídas de alerta seriam indefinidas. Nesse cenário, as variáveis
a
eb
seriam armazenadas no objeto de ativação a partir dofoobar
qual não podemos acessar (é claro que poderíamos acessá-las diretamente chamandoa
eb
).fonte
eval
é uma opção.fonte
Você pode usar o objeto window para acessá-lo.
window
tem uma referência a todas as variáveis globais e funções globais que você está usando.fonte
Só não sei o que uma resposta ruim recebe tantos votos. É uma resposta bastante fácil, mas você a torna complexa.
fonte
this
" - Se você deseja acessar uma variável global dessa maneira, é melhor ser explícito e usar owindow
objeto, nãothis
.this
é ambíguo.this
, ou qualquer outra coisa, para acessar a variáveltype
do seu exemplo, se você tiver o nome em outra variável:function test(vname) { var type = 'article'; this[vname] = 'something else'; alert(type); }; test('type')
será exibidoarticle
, nãosomething else
. E é isso que a "resposta complexa" explica.Tente isso ...
fonte
Isto é um exemplo :
Outro exemplo :
Portanto, o valor " coco " de myVariable se torna um coco variável .
Porque todas as variáveis no escopo global são propriedades do objeto Window.
fonte
Em Javascript, você pode usar o fato de que todas as propriedades são pares de valores-chave. jAndy já mencionou isso, mas não acho que a resposta dele mostre como pode ser explorada.
Normalmente você não está tentando criar uma variável para armazenar um nome de variável, mas está tentando gerar nomes de variáveis e depois usá-los. O PHP faz isso com
$$var
notação, mas o Javascript não precisa, porque as chaves de propriedade são intercambiáveis com as chaves da matriz.dá 123. Geralmente você deseja construir a variável e é por isso que existe a indireção, para que você também possa fazer o contrário.
fonte
2019
TL; DR
eval
O operador pode executar a expressão de seqüência de caracteres no contexto chamado e retornar variáveis desse contexto;literal object
teoricamente, podemos fazer isso escrevendo:,{[varName]}
mas bloqueado por definição.Então, me deparei com essa pergunta e todos aqui brincam sem trazer uma solução real. mas @Axel Heider tem uma boa abordagem.
A solução é
eval
. operador quase mais esquecido. (pense mais umwith()
)eval
O operador pode executar dinamicamente a expressão no contexto que chamou. e retorne o resultado dessa expressão. podemos usar isso para retornar dinamicamente o valor de uma variável no contexto da função.exemplo:
Observe que eu sempre escrevo explicitamente que a expressão
eval
será executada. Para evitar surpresas desnecessárias no código.eval
é muito forte, mas tenho certeza que você já sabe dissoBTW, se fosse legal, poderíamos usar
literal object
para capturar o nome e o valor da variável, mas não podemos combinar nomes de propriedades computados e valores abreviados de propriedades, infelizmente, são inválidos.fonte
Se você não quiser usar um objeto global como window ou global (node), tente algo como isto:
fonte
Eu precisava desenhar vários FormData em tempo real e o objeto funcionou bem
Em seguida, nos meus loops, sempre que necessário, para criar os dados do formulário que usei
fonte
Essa é uma alternativa para quem precisa exportar uma variável nomeada dinamicamente
Outra alternativa é simplesmente criar um objeto cujas chaves sejam nomeadas dinamicamente
fonte
o que eles querem dizer é não, você não pode. não há como fazê-lo. então era possível que você pudesse fazer algo assim
tendo uma função de criação como a implementada no ECMAScript 5.
fonte
eval
operadoreval () não funcionou nos meus testes. Mas é possível adicionar um novo código JavaScript à árvore do DOM. Então, aqui está uma função que adiciona uma nova variável:
fonte
var node_head = document.getElementsByTagName("head")[0]
em vez de ID, como ninguém dá umaid="head"
para<head>
:-)Embora isso tenha uma resposta aceita, gostaria de acrescentar uma observação:
No ES6, o uso
let
não funciona :No entanto, usando
var
obrasEspero que isso possa ser útil para alguns.
fonte
const
const vars = { t, m, b }; console.log(vars['b'])
. Caso contrário,eval
também funciona.use Object também é ótimo.
fonte