2010-04-08 14 views
20

Wenn ich eine Funktion aufrufe, wird ein lokaler Bereich für diesen Aufruf erstellt. Gibt es eine Möglichkeit, diesen Bereich direkt als Objekt zu referenzieren? Genau wie Fenster ist eine Referenz für das globale Scope-Objekt.JavaScript: Verweis auf einen lokalen Bereich für Funktionen als Objekt

Beispiel:

function test(foo){ 
    var bar=1 
    //Now, can I access the object containing foo, bar, arguments and anything 
    //else within the local scope like this: 
    magicIdentifier.bar 
} 

Alternativ hat jemand eine vollständige Liste von dem, was oben auf benutzerdefinierten Variablen im lokalen Bereich ist?

Hintergrund: Ich versuche, auf einen Weg der vollständigen Verlagerung in den globalen Bereich innerhalb eines Funktionsaufrufs zu kommen, die mit Anweisung ist ein Witz, Aufruf funktioniert ein wenig besser, aber es bricht immer noch für alles in Funktion deklariert Bereich, aber nicht im globalen Umfang, daher würde ich diese wenigen Fälle im globalen Umfang erklären, aber das erfordert von mir zu wissen, was sie sind. Die IE-Funktion execScript macht eine komplette Verschiebung, aber das löst nur das Problem für IE.

Hinweis: Für jeden, der JavaScript dynamisch lädt, ist setTimeout(code,1) ein einfacher effektiver Hack, um den globalen Geltungsbereich zu erreichen, aber er wird nicht sofort ausgeführt.

+0

Wenn Sie auf das Objekt mit dem 'foo'-Argument innerhalb der Funktion zugreifen müssen, warum übergeben Sie dieses Objekt nicht direkt als Argument? –

Antwort

13

Nein, es gibt keine Möglichkeit, die variable Aufgabe des Ausführungskontextes eine FunktionBindungs ​​Objekt der variablen Umgebung des Ausführungskontextes zu verweisen (so heißt das Ding [jetzt; daher der Durchschlag]; Details in §10.3 of the specification). Sie können nur auf die eingeschränkte Sicht darauf zugreifen, die Sie mit arguments bekommen (was sehr begrenzt ist).

Normalerweise, wenn ich das tun wollte, habe ich einfach alles, was ich wollte auf ein Objekt und dann verwendet, dass (z. B. übergeben Sie es in eine Funktion). Natürlich haben alle Funktionen, die innerhalb des Kontexts erstellt werden, Zugriff auf alles, was in dem Bereich, in dem sie erstellt wurden, vorhanden ist, da sie sich über den Kontext "schließen". mehr: Closures are not complicated.

+1

Wow, diese Spezifikationen sind wirklich ein Schmerz zu lesen. Jedenfalls scheinen sie, soweit ich das beurteilen kann, darauf hinzuweisen, dass die einzigen lokalen Variablen außer den Parametern und den definierten Locals Argumente und Länge sind. Das sollte mich in Bewegung bringen, danke. Ich baue eine Bibliothek, und die erste Funktion, die ich mache, ist eine konsistente Version von setInterval, für die das ist. Alles scheint so viel komplizierter zu werden, wenn man eine glänzende, abstrahierte Oberfläche hat. – aaaaaaaaaaaa

+0

@eBusiness: Ja, ja, tut es. Vergessen Sie nicht irgendwelche benannten Funktionen, die in der Funktion deklariert sind, das sind auch In-Scope-Symbole. –

1

Bestimmte Versionen von Netscape hatten eine magische Eigenschaft in dem arguments Objekt, das getan hat, was Sie suchen. (Ich kann mich nicht erinnern, was es hieß)

+0

'Argumente' ist eine Variable, die alle Argumente enthält, die an die aktuelle Funktion übergeben werden. – nickf

+1

@nickf: Das merke ich. In bestimmten Versionen von Netscape hatte es eine spezielle Funktion, die sich auf den variablen Bereich bezog. – SLaks

+1

@nickf: Ich habe es auch zuerst falsch gelesen, aber als ich SLaks kannte, gab ich ihm eine zweite Lektüre und erkannte, was er meinte. :-) –

-2

Sie benötigen kein Schlüsselwort, um auf eine Variable im lokalen Bereich zu verweisen, da der Bereich ist, in dem Sie sich befinden.

+5

Ja, ich denke, er will über sie oder etwas iterieren ... – nickf

+1

Iterieren über jede einzelne Variable, die im aktuellen Bereich existiert? Das klingt Javascriptic (oder was auch immer das Javascript-Analogon des Wortes "Pythonic" ist) für mich. –

+1

Ohne ein Objekt, das auf lokale Variablen verweist, klingt Un-Javascriptic für mich. Ich brauche es nicht, aber ich würde erwarten, dass es existiert, JavaScript scheint Objekte für fast alles und alles über Objekte zu haben. – Rolf

0

Was ist mit so etwas?

<script type="text/javascript"> 
    var test = { 
     bar : 1, 
     foo : function() { 
      alert(this.bar); 
     } 
    } 

    test.foo(); 
</script> 
+0

Wenn mein Ziel einfach wäre, ungeraden Code zu schreiben, wäre das eine schöne Lösung gewesen :-) – aaaaaaaaaaaa

+0

Lol. Ich sehe nicht, wie es seltsam ist, da Sie einfach eine einfache Klassenstruktur erstellen. –

0

, wenn Sie den Umfang der Funktion auf jedes Objekt verschieben möchten, können Sie den Unterstrich Bibliothek verwenden _.bind

In Ihrem Fall:

var fn = _.bind(function(){ 
    console.log(this == window) 
},window) 

fn() // true 
+2

Das ist nicht der Funktionsumfang, das ist 'this'. – aaaaaaaaaaaa

6

ich das wissen Es ist sehr spät, und Sie sind wahrscheinlich nicht einmal ein wenig interessiert, aber ich war auch daran interessiert, die Machbarkeit von diesem und Sie sollten in der Lage sein, eine Art von Arbeit zu machen mit:

(function(global) { 
    var testVar = 1; 

    global.scope = function(s) { 
     return eval(s); 
    } 
})(this); 

dann ausgeführt wird:

scope('testVar'); // 1 

gibt die Variable aus der Schließung.Nicht besonders nett, aber theoretisch möglich, das in ein Objekt zu verpacken, vielleicht mit einigen Validierungen und Gettern und Settors, wenn Sie gebraucht werden?

Bearbeiten: Nachdem ich die Frage erneut gelesen habe, nehme ich an, dass Sie darauf zugreifen möchten, ohne eine Funktion im Bereich selbst angeben zu müssen, daher ist dies wahrscheinlich nicht anwendbar. Ich werde das hier trotzdem lassen.

+1

Ich denke, das ist brilliant! –

Verwandte Themen