2009-04-07 24 views
25

Czy istnieje sposób na znalezienie zmiennej JavaScript na stronie (pobierz jako obiekt) po nazwie? Nazwa zmiennej jest dostępna jako stała łańcuchowa.Jak znaleźć zmienną JavaScript o nazwie

+0

Zobacz także późniejsze pytanie z dodatkowymi odpowiedziami: http://stackoverflow.com/questions/5117127/javascript-dynamic-variable-name i http://stackoverflow.com/questions/1664282/javascript-refer-to- a-variable-using-a-string-zawiera-swoją-nazwę – goodeye

Odpowiedz

29
<script> 
var a ="test"; 
alert(a); 
alert(window["a"]); 
alert(eval("a")); 
</script> 
+37

Proszę nie używać 'eval' do tego. –

+2

Co ze zmiennymi nie globalnymi? Czy jest jakaś inna opcja oprócz 'eval'? – mxro

+1

@mxro: W takiej sytuacji należy użyć [właściwości obiektu] (http://stackoverflow.com/a/25529838/157247). –

0

Można użyć eval()

+3

nigdy * nigdy * używaj eval, gdzie nie musisz głosować w górę – annakata

+2

. proste pytanie zasługuje na prostą odpowiedź. Poszedłbym z eval(), jeśli z jakiegokolwiek powodu potrzebował spojrzeć na zawartość zmiennej przez jego nazwę. –

+3

A). co nie jest proste w oknie [foo]? B). szybkość i bezpieczeństwo Cię nie dotyczą? eval jest toksyczny, poważnie – annakata

26

obiektów Wszystko JS (które są zmienne) są dostępne w ich zakres, jak nazwanych właściwości swojego obiektu nadrzędnego. Tam, gdzie nie istnieje jawny element nadrzędny, jest to domyślnie obiekt window.

tj:

var x = 'abc'; 
alert(window['x']); //displays 'abc' 

i złożonego obiektu:

var x = {y:'abc'}; 
alert(x['y']); //displays 'abc' 

a to może być przykuty:

var x = {y:'abc'}; 
alert(window['x']['y']); //displays 'abc' 
+5

Dotyczy to tylko zmiennych o zasięgu globalnym - jeśli zasięg jest na poziomie funkcji, nie ma obiektu, który umożliwia dostęp do środowiska leksykalnego. – Christoph

+0

Oczywiście, ale nic nie pomaga. Zakłada to, że możesz wyrazić var ​​jako konstrukt notacji kropkowej. – annakata

+0

Jeśli chcesz to zrobić w ramach funkcji, jedynym rozwiązaniem jest umieszczenie twoich vars w sprzeciwie i uzyskanie dostępu do kluczy obiektu, na przykład: http://stackoverflow.com/questions/4109297/javascript-function-name -as-a-string-in-self-executing-function/4109730 # 4109730 –

4

Jeżeli ciąg odwołuje się do 'głębokiego' własność globalny, jak "Yankee.console.format" można przejść przez referencje:

String.prototype.deref= function(){ 
    // remove leading and trailing quotes and spaces 
    var obj= this.replace(/(^[' "]+|[" ']+$)/g,''); 

    var M= obj.match(/(^[\w\$]+(\.[\w\$]+)*)/); 
    if(M){ 
     M= M[1].split('.'); 
     obj= window[M.shift()]; 
     while(obj && M.length) obj= obj[M.shift()]; 
    } 
    return obj || this; 
} 
5

Jeśli potrzebna jest zmienna zadeklarowana w kontekście globalnym, jest ona dołączana do obiektu okna. ex: window ["variableName"]. Wszystkie zmienne są wartościami tabeli mieszania w ramach ich zakresu.

Jeśli musisz użyć notacji kropkowanej, będziesz chciał postępować zgodnie z sugestią Kennebec, aby poruszać się po hierarchii obiektów. eval() może również działać, ale jest droższą operacją, niż prawdopodobnie jest potrzebna.

1

Jeśli jest to zmienna globalna, można szukać go po imieniu na globalnego obiektu, ponieważ zmienne globalne są właściwości obiektu globalnego. W przeglądarkach, istnieje zmienna globalna, która odnosi się do globalnego obiektu zwanego window, więc:

var name = "foo"; 
window.foo = 42; 
alert(Number(window[name])); // 42 

Ale zmienne globalne są złe (tm).

Aby to zrobić bez globalnych, użyć własnego obiektu:

var name = "foo"; 
var obj = {}; 
obj.foo = 42; 
alert(Number(obj[name])); // 42 

obu powyższych prac, ponieważ w JavaScripcie, można odwołać się do właściwości obiektu albo z kropką notacji i dosłownym (obj.foo), lub z notacją nawiasową i ciągiem znaków (obj["foo"]), w drugim przypadku ciąg może być wynikiem dowolnego wyrażenia, w tym zmiennego odnośnika.

+0

Co zrobić, jeśli' obj' będzie zmienną, która ma być dostępna (a nie 'obj.foo') - czy" eval "będzie jedyną opcją? – mxro

+0

@mxro: Jeśli 'obj' byłby globalny, możesz użyć' window ["obj"] '. Gdyby tak nie było, musiałbyś użyć 'eval'. Ale nie chciałbym, zmieniłbym swój kod, aby umieścić 'obj' w kontenerze, więc mogłem po prostu wyszukać go w normalny sposób. –

+0

Tak, to brzmi dobrze. Myślę, że początkowo stworzyłem zmienną w wyrażeniu 'eval', które następnie mogłem pobrać tylko przez drugą' eval' - ale potem zmieniłem kod, że zmienna kontenerowa jest tworzona przed pierwszym 'eval'; eliminując potrzebę drugiego "ewalu". – mxro

Powiązane problemy