W PHP możesz robić niesamowite / przerażające rzeczy, takie jak:
$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1
Czy jest jakiś sposób na zrobienie czegoś takiego za pomocą Javascript?
Na przykład, jeśli mam, var name = 'the name of the variable';
czy mogę uzyskać odwołanie do zmiennej o nazwie name
?
javascript
dynamic-variables
Finbarr
źródło
źródło
Odpowiedzi:
Ponieważ chodzi o ECMA- / Javascript
Objects
iContexts
(które są również jakimś przedmiotem Object), każda zmienna jest przechowywana w tak zwanej Zmiennej (lub w przypadku Funkcji, Aktywacji Obiekt ).Więc jeśli utworzysz zmienne takie jak to:
W zakresie globalnym (= kontekst funkcji NO) niejawnie zapisujesz te zmienne w obiekcie globalnym (=
window
w przeglądarce).Można do nich uzyskać dostęp za pomocą notacji „kropka” lub „nawias”:
lub
To działa tylko dla globalnego obiektu w tym konkretnym przypadku, ponieważ zmienna obiektu na obiekt globalny jest
window
sam obiekt. W kontekście funkcji nie masz bezpośredniego dostępu do obiektu aktywacyjnego . Na przykład:new
tworzy nową instancję samodzielnie zdefiniowanego obiektu (kontekstu). Beznew
zakresu funkcji byłoby równieżglobal
(= okno). Ten przykład odpowiednio ostrzegłbyundefined
i1
. Gdybyśmy zastąpilithis.a = 1; this.b = 2
:Oba wyjścia alarmowe byłyby niezdefiniowane. W tym scenariuszu zmienne
a
ib
byłyby przechowywane w obiekcie aktywacyjnym, zfoobar
którego nie mamy dostępu (oczywiście moglibyśmy uzyskać do nich bezpośredni dostęp poprzez wywołaniea
ib
).źródło
eval
jest jedną z opcji.źródło
Możesz do tego użyć obiektu okna.
window
zawiera odniesienie do wszystkich używanych zmiennych globalnych i funkcji globalnych.źródło
Tylko nie wiem, jak zła odpowiedź dostaje tyle głosów. Odpowiedź jest dość łatwa, ale komplikujesz ją.
źródło
this
” - Jeśli chcesz uzyskać dostęp do zmiennej globalnej w ten sposób, lepiej jest być jawnym i używaćwindow
obiektu, a niethis
.this
jest dwuznaczny.this
ani nic innego, aby uzyskać dostęp do zmiennejtype
z twojego przykładu, jeśli masz jej nazwę w innej zmiennej:function test(vname) { var type = 'article'; this[vname] = 'something else'; alert(type); }; test('type')
pokażearticle
, niesomething else
. I to wyjaśnia „złożona odpowiedź”.Spróbuj tego...
źródło
To jest przykład :
Inny przykład :
Zatem wartość „ coco ” w myVariable staje się zmienną coco .
Ponieważ wszystkie zmienne w zakresie globalnym są właściwościami obiektu Window.
źródło
W Javascripcie możesz użyć faktu, że wszystkie właściwości są parami klucz-wartość. jAndy już o tym wspomniał, ale nie sądzę, aby jego odpowiedź wskazywała, jak można go wykorzystać.
Zwykle nie próbujesz utworzyć zmiennej do przechowywania nazwy zmiennej, ale próbujesz wygenerować nazwy zmiennych, a następnie użyć ich. PHP robi to z
$$var
notacją, ale JavaScript nie musi tego robić, ponieważ klucze właściwości są wymienne z kluczami tablic.daje 123. Zwykle chcesz skonstruować zmienną, dlatego istnieje pośredni charakter, więc możesz to zrobić na odwrót.
źródło
2019
TL; DR
eval
operator może uruchamiać wyrażenie łańcuchowe w kontekście, który wywołuje i zwraca zmienne z tego kontekstu;literal object
teoretycznie może to zrobić przez zapis:,{[varName]}
ale z definicji jest zablokowane.Natrafiam więc na to pytanie i wszyscy tutaj bawią się bez rzeczywistego rozwiązania. ale @Axel Heider ma dobre podejście.
Rozwiązaniem jest
eval
. prawie najbardziej zapomniany operator. (myślę, że większość z nich jestwith()
)eval
operator może dynamicznie uruchamiać wyrażenie w kontekście, który wywołał. i zwróć wynik tego wyrażenia. możemy tego użyć, aby dynamicznie zwrócić wartość zmiennej w kontekście funkcji.przykład:
Zauważ, że zawsze piszę jawnie, wyrażenie
eval
będzie działać. Aby uniknąć niepotrzebnych niespodzianek w kodzie.eval
jest bardzo silny, ale jestem pewien, że już o tym wieszBTW, gdyby było to zgodne z prawem, moglibyśmy użyć
literal object
do przechwycenia nazwy i wartości zmiennej, ale nie możemy łączyć obliczonych nazw właściwości i wartości nieruchomości w skrócieźródło
Jeśli nie chcesz używać obiektu globalnego, takiego jak okno lub globalny (węzeł), możesz wypróbować coś takiego:
źródło
Musiałem narysować wiele FormData w locie, a sposób obiektowy działał dobrze
Następnie w moich pętlach, gdziekolwiek musiałem utworzyć dane formularza, których użyłem
źródło
Jest to alternatywa dla tych, którzy muszą wyeksportować zmienną o nazwie dynamicznej
Inną alternatywą jest po prostu utworzenie obiektu, którego klucze są nazywane dynamicznie
źródło
mają na myśli nie, nie możesz. nie ma sposobu, aby to zrobić. więc możliwe było zrobienie czegoś takiego
posiadające funkcję tworzenia podobną do tej zaimplementowanej w ECMAScript 5.
źródło
eval
operatoreval () nie działał w moich testach. Możliwe jest jednak dodanie nowego kodu JavaScript do drzewa DOM. Oto funkcja dodająca nową zmienną:
źródło
var node_head = document.getElementsByTagName("head")[0]
zamiast identyfikatora, jak nikt nie przywiązuje sięid="head"
do<head>
:-)Chociaż mam zaakceptowaną odpowiedź, chciałbym dodać spostrzeżenie:
W ES6 używanie
let
nie działa :Jednak korzystanie
var
działaMam nadzieję, że może to być przydatne dla niektórych.
źródło
const
const vars = { t, m, b }; console.log(vars['b'])
. W przeciwnym razieeval
działa również.użycie Object jest również świetne.
źródło