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
Odpowiedz
<script>
var a ="test";
alert(a);
alert(window["a"]);
alert(eval("a"));
</script>
Proszę nie używać 'eval' do tego. –
Co ze zmiennymi nie globalnymi? Czy jest jakaś inna opcja oprócz 'eval'? – mxro
@mxro: W takiej sytuacji należy użyć [właściwości obiektu] (http://stackoverflow.com/a/25529838/157247). –
Można użyć eval()
nigdy * nigdy * używaj eval, gdzie nie musisz głosować w górę – annakata
. proste pytanie zasługuje na prostą odpowiedź. Poszedłbym z eval(), jeśli z jakiegokolwiek powodu potrzebował spojrzeć na zawartość zmiennej przez jego nazwę. –
A). co nie jest proste w oknie [foo]? B). szybkość i bezpieczeństwo Cię nie dotyczą? eval jest toksyczny, poważnie – annakata
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'
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
Oczywiście, ale nic nie pomaga. Zakłada to, że możesz wyrazić var jako konstrukt notacji kropkowej. – annakata
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 –
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;
}
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.
var getVar = function (obj) {
for(var key in this) {
if(obj === this[key]) return key;
}
};
foo = 'foo';
console.log(getVar(foo)); // => 'foo'
Podwójne 'foo' pomaga śledzić –
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.
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
@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. –
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
- 1. Posłuchaj funkcji o nazwie JavaScript
- 2. Funkcja JavaScript o nazwie "akcja"
- 3. zmiennej o nazwie niezdefiniowane w JavaScript Bibliotek
- 4. Jak zadeklarować zmienną o nazwie "type" w Play/Scala?
- 5. Sortowanie obiekt JavaScript o nazwie własności
- 6. Uzyskaj ciąg kwerendy o nazwie pliku JavaScript
- 7. JavaScript: dostęp do tablicy o tej samej nazwie co zmienna?
- 8. Jak zapisać zmienną JavaScript między ramkami?
- 9. Jak zwrócić null z konstruktora o nazwie new w JavaScript?
- 10. Jak wywołać funkcję JavaScript o nazwie `call` z dartu
- 11. Odwołanie do typu nie może znaleźć typu publicznego o nazwie
- 12. WebPack nie może znaleźć modułu jeśli plik o nazwie JSX
- 13. Jak znaleźć plik po jego częściowej nazwie?
- 14. Nie można znaleźć zasobu o nazwie "X", dlaczego nie?
- 15. Dlaczego VirtualBox może nie znaleźć zarejestrowanej maszyny o nazwie Windows_7?
- 16. Nie można znaleźć cache o nazwie '' dla CacheableOperation [] skrytek
- 17. Nie można znaleźć interfejsu sieciowego o podanej nazwie
- 18. Wyzwalacz UpdatePanel: nie można znaleźć zdarzenia o nazwie "OnRowCommand"
- 19. MongoDB: Zapytanie o klucz o nazwie spacji w nazwie
- 20. Jak prześledzić każdą metodę o nazwie
- 21. Rozpocznij proces o nazwie
- 22. JavaScript, otrzymujĘ ... c wartość td o nazwie id
- 23. Jak wybrać zmienne (bez tekstu) o tej samej nazwie?
- 24. Jak znaleźć plik z javascript?
- 25. getDatabase o nazwie rekursywnie
- 26. Emacs: jak znaleźć zmienną według jej wartości?
- 27. używając operatora rozprzestrzeniania `...` w javascript es6 o nazwie export
- 28. Jaki jest cel parametru o nazwie "niezdefiniowany" w funkcji JavaScript?
- 29. Brak modułu o nazwie builtins
- 30. Brak modułu o nazwie traitlets.config.application
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