2010-02-25 17 views
14

Mögliche Duplizieren:
How can I access local scope dynamically in javascript?Javascript: Erhalten Sie Zugriff auf lokale Variable oder eine Variable in Schließung durch seinen Namen

Hallo alle.
Wir alle wissen, dass Sie eine Eigenschaft eines JavaScript-Objekt zugreifen, indem sie den Namen der [] Syntax .. mit z ob ['NameOffProperty'].

Können Sie das gleiche für eine lokale Variable? Eine andere Antwort here schlug vor, die Antwort ist, Fenster ['NameOfVar'] zu verwenden. Dies funktionierte jedoch nur für das Poster, da er Variablen auf Fensterebene definierte.

Ich gehe davon aus, dass dies in der Regel möglich sein muss, wie Firefox Firebug (was ich glaube ist in JavaScript geschrieben) lokale und Verschlussgrößen zeigen. Gibt es eine versteckte Sprachfunktion, die mir nicht bekannt ist?

Insbesondere ist hier, was ich tun möchte:

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

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

+0

Sie können auch schauen http://StackOverflow.com/questions/ 1119335/javascript-local-variable-deklarieren http: // stackoverflow.com/questions/598878/how-can-i-Zugriff-local-scope-dynamisch-in-javascript –

Antwort

13

Ich bin mir nicht bewusst etwas in JavaScript gebaut lokale Variablen wie das referenzieren (obwohl es sollte wohl alle Variablen in Betracht ziehen werden intern von Strings referenziert).

Ich würde vorschlagen, alle Variablen in einem Objekt zu halten, wenn Sie wirklich den Zugriff durch Zeichenfolge benötigen:

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

Update: Es Art nervt mich, dass es keine Möglichkeit gibt, dies zu tun, wie Sie wollen. Intern ist die Variable eine änderbare Bindung in den deklarativen Umgebungsdatensätzen. Eigenschaften sind über die Umgebungsdatensätze des Objekts an das Objekt gebunden, zu dem sie gehören. Es gibt jedoch eine Möglichkeit, mit Klammern darauf zuzugreifen. Leider gibt es keine Möglichkeit, auf dieselbe Weise auf die deklarativen Umgebungsdaten zuzugreifen.

+0

Bob, nervt mich auch. Es ist die Tatsache, dass EcmaScript dies in der Theorie unterstützt, die Implementierung (JavaScript) jedoch nicht. –

7

Zugriff auf die Variable mit Fenster oder einer anderen globalen Zugriffs wird nicht funktionieren, da die Variable nicht global zugänglich ist. Sie können jedoch können eval verwenden jeden Ausdruck bewerten:

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

test(); 
</script> 
+0

Danke Pan. Ich denke, ich hätte die Frage klarer beantworten und sagen sollen, ohne eval zu benutzen. :-) Sieht so aus, als ob das die einzige Möglichkeit ist, das zu tun, was ich will, ohne das Muster zu modifizieren. –

2

Nein, da die Variable nur von innerhalb der Ausführungskontexte ist, dass die Variable Umfang enthalten.

Anders gesagt, die einzige Möglichkeit, auf j zuzugreifen, ist, wenn Sie von etwas im Bereich test aus zugreifen - über eine innere Funktion oder was auch immer. Dies liegt daran, j, in einem gewissen Sinn existiert nicht auf Objekte mit einem größeren Umfang, wie das globale Objekt. Wenn es anders wäre, müssten Variablennamen global eindeutig sein.

2

Was:

<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

Da Func kein Objekt ist, zeigt es auf das globale Objekt. Du sprichst im Wesentlichen Fenster ['j'] – Bob

+0

@Bob, hast du es versucht, bevor Sie mich downvoting? Weil es funktioniert. – Mic

+0

@Bob, ok, ich habe dich, du hast recht – Mic

2

Nein, das ist nicht möglich, in der Regel ist. JavaScript löst Bezeichner in einer Funktion mithilfe der Geltungsbereichskette auf. Es gibt kein einzelnes Objekt, das alle Variablen im Gültigkeitsbereich enthält, und auf die Objekte in der Bereichskette kann nicht zugegriffen werden, wenn JavaScript auf der Seite ausgeführt wird.

Verwandte Themen