2009-02-28 8 views
18

Wenn Sie globale Funktionen und Variable verwenden möchten, dynamisch können Sie:Wie kann ich den lokalen Bereich dynamisch in Javascript zugreifen?

window[functionName](window[varName]); 

Ist es möglich, die gleiche Sache für Variablen im lokalen Bereich zu tun?

Dieser Code funktioniert korrekt, aber derzeit verwendet Eval und ich versuche, darüber nachzudenken, wie es sonst geht.

var test = function(){ 
    //this = window 
    var a, b, c; //private variables 

    var prop = function(name, def){ 
     //this = window 
     eval(name+ ' = ' + (def.toSource() || undefined) + ';');  

     return function(value){ 
      //this = test object 
      if (!value) { 
       return eval('(' + name + ')'); 
      } 
      eval(name + ' = value;') 
      return this; 
     }; 

    }; 

    return { 
     a:prop('a', 1), 
     b:prop('b', 2), 
     c:prop('c', 3), 
     d:function(){ 
      //to show that they are accessible via to methods 
      return [a,b,c]; 
     } 
    }; 
}(); 

>>>test 
Object 
>>>test.prop 
undefined 
>>>test.a 
function() 
>>>test.a() 
1 //returns the default 
>>>test.a(123) 
Object //returns the object 
>>>test.a() 
123 //returns the changed private variable 
>>>test.d() 
[123,2,3] 
+1

Ich verstehe, warum ich jetzt verwirrt war, weil Sie die Variablen abc sowie die Namen für die Rückkehr benennen. Du solltest diese Namen ändern, das hat mich verwirrt. Wie auch immer, bessere Antworten als meine sind aufgetaucht, also werde ich mich jetzt nur noch an Crescentfresh halten. –

+0

@Gothdo Die Frage, die Sie verlinken, fragt etwas anderes. Die Variablen, auf die er zuzugreifen versucht, sind globale Variablen. Die akzeptierte Antwort verwendet auch globale Variablen. Die verknüpfte Frage sollte geändert werden. – Annan

Antwort

6

Nein, wie crescentfresh sagte. Im Folgenden finden Sie ein Beispiel für die Implementierung ohne eval, aber mit einem internen privaten Objekt.

+0

Was ist mit Aufzählung der lokalen Variablen in der Funktion selbst? Mit anderen Worten, wie eval, aber wenn Sie nicht wissen, was die Einheimischen sind ... – Michael

+0

@Michael Es tut mir leid, aber ich verstehe nicht, was du meinst. Kannst du ein Beispiel geben? Oder vielleicht sogar deine eigene Antwort schreiben? – some

+0

Ich habe keine Antwort, und alles, was ich gelesen habe scheint darauf hinzuweisen, dass es unmöglich ist ... globale Variablen in einem Browser können mit etwas wie 'for (i in window)' aufgezählt werden; wäre schön, wenn das für Einheimische in einer Funktion möglich wäre. – Michael

2

Hoffentlich bin ich nicht allzu vereinfachend, aber was ist so einfach wie die Verwendung eines Objekts?

var test = { 
    getValue : function(localName){ 
     return this[localName]; 
    }, 
    setValue : function(localName, value){ 
     return this[localName] = value; 
    } 
}; 

>>> test.a = 123 
>>> test.getValue('a') 
123 
>>> test.a 
123 

>>> test.setValue('b', 999) 
999 
>>> test.b 
999 
+0

Wenn Sie nur direkt auf die lokalen Variablen des Objekts zugreifen wollen, was ist dann der Zweck, einen Getter oder Setter zu definieren? –

+0

Es gibt keins. Ich habe nur hinzugefügt, dass die Verwendung mit Annans Beispiel identisch wäre. Ich stimme zu, es wäre in der Praxis völlig dumm. –

+0

Der Grund für den Code besteht darin, zu emulieren, wie Getter und Setter übergreifend arbeiten. Daher war mein ursprünglicher Code falsch (jetzt behoben), da die Variablen prop(), die erstellt wurden, für den Rest des Objekts nicht verfügbar waren. Ihr Weg ermöglicht den direkten Zugriff und die Manipulation von Eigenschaften. – Annan

7

Ihre Frage zu beantworten, nein, es gibt keine Möglichkeit, dynamisches Variable-Lookup in einem lokalen Bereich zu tun, ohne eval() zu verwenden.

Die beste Alternative ist, Ihren "Scope" zu einem normalen Objekt [literal] zu machen (dh "{}"), und stecken Sie Ihre Daten dort hinein.

Verwandte Themen