2010-02-25 10 views
14

Powiel możliwe:
How can I access local scope dynamically in javascript?Javascript: Uzyskaj dostęp do zmiennej lokalnej lub zmiennej w zamknięciu przez jego nazwę

Witam wszystkich.
Wszyscy wiemy, że można uzyskać dostęp do właściwości obiektu javascript według jego nazwy, używając składni [] np. ob ['nameOfProperty'].

Czy możesz zrobić to samo dla zmiennej lokalnej? Inną odpowiedzią, którą zaproponował here, jest użycie okna ['nameOfVar']. Jednak działało to tylko dla plakatu, ponieważ definiował zmienne w zakresie poziomu okna.

Zakładam, że to musi być ogólnie możliwe, ponieważ Firebug Firefoksa (który, jak sądzę, jest napisany w javascript) może pokazywać zmienne lokalne i zamykające. Czy jest jakiś ukryty język, którego nie znam?

Konkretnie, oto co chcę zrobić:

var i = 4; 
console.log(window['i']); // this works.. 

function Func(){ 
    var j = 99; 

    // try to output the value of j from its name as a string 
    console.log(window['j']); // unsurprisingly, this doesn't work 
} 

Func(); 
+1

Zobacz http://stackoverflow.com/questions/598878/how-can-i-access-local-scope-dynamically-in-javascript –

+0

Możesz także obejrzeć http://stackoverflow.com/questions/ 1119335/javascript-local-variable-declare http: // stackoverflow.com/questions/598878/how-can-i-access-local-scope-dynamically-in-javascript –

Odpowiedz

13

Nie jestem świadomy niczego wbudowanego w JavaScript, aby odwoływać się do zmiennych lokalnych, takich jak ten (chociaż prawdopodobnie powinno być biorąc pod uwagę, że wszystkie zmienne są wewnętrznie odwoływane przez łańcuchy).

Sugerowałbym zachowaniu wszystkich zmiennych w obiekcie, jeśli naprawdę potrzebujesz dostępu przez ciąg:

var variables = { 
    "j": 1 
}; 
alert(variables["j"]); 

Aktualizacja: to rodzaj błędów mi się, że nie ma sposobu, aby to zrobić, jak chcesz. Wewnętrznie zmienna jest zmiennym wiązaniem w deklaratywnych rekordach środowiska. Właściwości są powiązane z obiektem, którego są własnością poprzez rekordy środowiska obiektu, ale w rzeczywistości istnieje sposób uzyskania do nich dostępu za pomocą nawiasów. Niestety, nie ma sposobu, aby uzyskać dostęp do deklaratywnych rekordów środowiska w ten sam sposób.

+0

Bob, też mnie skrzywdził. Faktem jest, że EcmaScript obsługuje to w teorii, ale implementacja (JavaScript) nie działa. –

7

Dostęp do zmiennej z okna lub innego globalnego akcesor nie zadziała, ponieważ zmienna ta nie jest dostępna globalnie. Ale można użyć można użyć eval ocenić dowolne wyrażenie:

<script> 
function test(){ 
    var j = 1; 
    alert(eval("j")); 
} 

test(); 
</script> 
+0

Dzięki Pan. Sądzę, że powinienem był wyraźniej odpowiedzieć na to pytanie i powiedzieć bez użycia ewaluacji. :-) Wygląda na to, że jest to jedyny sposób robienia tego, co chcę, bez modyfikowania wzoru. –

2

Nie, ponieważ zmienna jest dostępna tylko od wewnątrz kontekstów wykonania, które zawierają zakres zmiennej.

Innymi słowy, jedynym sposobem uzyskania dostępu do j jest uzyskanie dostępu do niego z poziomu z zakresu test - za pośrednictwem funkcji wewnętrznej lub innej. Wynika to z faktu, że j w pewnym sensie nie istnieje dla obiektów o szerszym zakresie, takich jak obiekt globalny. Gdyby było inaczej, nazwy zmiennych musiałyby być globalnie unikalne.

2

Co o:

<script> 
    function Func(){ 
     var fn = arguments.callee; 
     fn.j = 99; 
     console.log(fn['j']); 
    } 
    Func(); 
    console.log(window['j']); //not global 
    console.log(Func['j']); //but not private 
</script> 
+0

Ponieważ Func nie jest obiektem, to wskazuje na obiekt globalny. Zasadniczo mówisz, że okno ['j'] – Bob

+0

@ Bob, sprobowałeś, zanim mnie ocuciłeś? Ponieważ działa. – Mic

+0

@ Bob, ok, mam cię, masz rację – Mic

2

Nie, nie jest to możliwe w ogóle. JavaScript rozwiązuje identyfikatory wewnątrz funkcji za pomocą łańcucha zasięgu; nie ma jednego obiektu zawierającego wszystkie zmienne w zasięgu, a obiekty w łańcuchu zasięgu są niedostępne z JavaScriptu działającego na stronie.

Powiązane problemy