Gibt es eine Möglichkeit, alle Variablen, die derzeit in Javascript enthalten sind, abzurufen?
javascript
Ian
quelle
quelle
for (v in this) alert(v);
. Allerdings sind nicht alle Globals aufzählbar, und ich kenne keinen Standardweg, um eine Liste der nicht aufzählbaren zu erhalten.this
, diearguments
Parameter und alle in umschließenden Bereiche definierten Variablen.Antworten:
Nein. "In Scope" -Variablen werden durch die "Scope Chain" bestimmt, auf die programmgesteuert nicht zugegriffen werden kann.
Ausführliche Informationen (ziemlich viele davon) finden Sie in der ECMAScript-Spezifikation (JavaScript). Hier ist ein Link zur offiziellen Seite, auf der Sie die kanonische Spezifikation (ein PDF) herunterladen können, und hier ist eine offiziellen, verlinkbaren HTML-Version.
Update basierend auf Ihrem Kommentar zu Camsoft
Die Variablen im Gültigkeitsbereich Ihrer Ereignisfunktion hängen davon ab, wo Sie Ihre Ereignisfunktion definieren und nicht davon, wie sie aufgerufen wird. Aber können Sie nützliche Informationen über das finden , was über an Ihre Funktion verfügbar ist
this
und Argumente etwas entlang der Linien zu tun , was KennyTM hingewiesen (for (var propName in ____)
) da , dass Sie sagen , was auf verschiedene Objekte zur Verfügung steht Ihnen zur Verfügung gestellt (this
und Argumente, wenn Sie Nicht sicher, welche Argumente sie Ihnen geben, können Sie über die herausfindenarguments
Variable , die implizit für jede Funktion definiert ist.Zusätzlich zu dem, was aufgrund der Definition Ihrer Funktion im Geltungsbereich liegt, können Sie herausfinden, was auf andere Weise noch verfügbar ist, indem Sie Folgendes tun:
(Sie können dies erweitern, um weitere nützliche Informationen zu erhalten.)
Stattdessen würde ich wahrscheinlich einen Debugger wie die Entwicklertools von Chrome verwenden (auch wenn Sie Chrome normalerweise nicht für die Entwicklung verwenden) oder Firebug (auch wenn Sie Firefox normalerweise nicht für die Entwicklung verwenden) oder Dragonfly on Opera verwenden oder "F12 Developer Tools" im IE. Und lesen Sie alle JavaScript-Dateien durch, die sie Ihnen zur Verfügung stellen. Und schlagen Sie sie über den Kopf, um die richtigen Dokumente zu erhalten. :-)
quelle
Zwar antworten alle mit " Nein " und ich weiß, dass "Nein" die richtige Antwort ist, aber wenn Sie wirklich lokale Variablen benötigen gibt es einen eingeschränkten Weg einer Funktion abrufen müssen.
Betrachten Sie diese Funktion:
Sie können Ihre Funktion in eine Zeichenfolge konvertieren:
Sie erhalten die Funktionsquelle als Zeichenfolge
Jetzt können Sie einen Parser wie esprima verwenden , um Funktionscode zu analysieren und lokale Variablendeklarationen zu finden.
und finde Objekte mit:
im Ergebnis (ich habe
console.log(x)
unten entfernt ):Ich habe dies in Chrome, Firefox und Node getestet.
Aber die Problem bei dieser Methode ist jedoch, dass Sie nur die Variablen in der Funktion selbst definiert haben. Zum Beispiel für diesen:
Sie haben nur Zugriff auf das x und nicht auf y . Sie können jedoch Ketten von Aufrufern (Argumente.callee.caller.caller.caller) in einer Schleife verwenden, um lokale Variablen von Aufruferfunktionen zu finden. Wenn Sie alle lokalen Variablennamen haben, haben Sie Bereichsvariablen . Mit den Variablennamen haben Sie mit einer einfachen Auswertung Zugriff auf Werte.
quelle
function getCounter(start){ return function(){ start ++; return start; } } var counter = getCounter(1); var startInClosure = eval.call(counter, 'this.start;'); console.log(startInClosure);
Es druckt,undefined
während ich erwarte, dass es 2 sein sollte.Ja und nein. "Nein" in fast jeder Situation. "Ja", aber nur in begrenztem Umfang, wenn Sie den globalen Bereich überprüfen möchten. Nehmen Sie das folgende Beispiel:
Welche Ausgaben, unter 150+ anderen Dingen , die folgenden:
Es ist also möglich, einige Variablen im aktuellen Bereich aufzulisten, aber sie sind jedoch nicht zuverlässig, prägnant, effizient oder leicht zugänglich.
Eine bessere Frage ist, warum Sie wissen möchten, welche Variablen im Geltungsbereich liegen.
quelle
for ( var i in window ) { if (window.hasOwnProperty(i)) { console.log(i, window[i]); }}
. Dadurch werden zumindest die geerbten Eigenschaften reduziert, und Ihre Variablen gehören zu nur etwa 50 anderen Eigenschaften.In ECMAScript 6 ist es mehr oder weniger möglich, den Code in eine
with
Anweisung mit einem Proxy-Objekt zu verpacken . Beachten Sie, dass ein nicht strenger Modus erforderlich ist und dass dies eine schlechte Praxis ist.Der Proxy behauptet, alle darin angegebenen Bezeichner zu besitzen
with
, sodass variable Zuweisungen im Ziel gespeichert werden. Bei Suchvorgängen ruft der Proxy den Wert vom Proxy-Ziel oder vom globalen Objekt ab (nicht vom übergeordneten Bereich).let
undconst
Variablen sind nicht enthalten.Inspiriert von dieser Antwort von Bergi .
quelle
Das kannst du nicht.
Variablen, Bezeichner von Funktionsdeklarationen und Argumente für Funktionscode werden als Eigenschaften des Variablenobjekts gebunden , auf die nicht zugegriffen werden kann.
Siehe auch:
quelle
with
Anweisung zum Einfügen anderer Objekte in die Kette verwendet werden kann).Der einfachste Weg, um in einem bestimmten Bereich Zugang zu Vars zu erhalten
Hinweis: Sie möchten dies gegen nicht minimierte js tun.
Der einfachste Weg, alle nicht privaten Vars anzuzeigen
Jetzt sehen Sie einen Objektbaum, den Sie mit allen deklarierten Objekten erweitern können.
quelle
Wie jeder bemerkte: Sie können nicht. Sie können jedoch ein Objekt erstellen und jede Variable, die Sie deklarieren, diesem Objekt zuweisen. Auf diese Weise können Sie ganz einfach Ihre Vars überprüfen:
quelle
console.log(window);
jsfiddle.net/4x3TxIch habe eine Geige gemacht, die (im Wesentlichen) die von iman skizzierten Ideen umsetzt. So sieht es aus, wenn Sie mit der Maus über das zweite Ipsum in fahren
return ipsum*ipsum - ...
Die Variablen, die sich im Gültigkeitsbereich befinden, werden dort hervorgehoben, wo sie deklariert sind (mit unterschiedlichen Farben für unterschiedliche Gültigkeitsbereiche). Das
lorem
mit rotem Rand ist eine schattierte Variable (nicht im Gültigkeitsbereich, aber im Gültigkeitsbereich, wenn das andere Lorem weiter unten im Baum nicht vorhanden wäre.)Ich verwende die esprima-Bibliothek, um das JavaScript zu analysieren, und estraverse, escodegen, escope (Dienstprogrammbibliotheken über esprima). Das "schwere Heben" wird von all diesen Bibliotheken durchgeführt (das komplexeste ist natürlich esprima selbst).
Wie es funktioniert
macht den abstrakten Syntaxbaum. Dann,
generiert eine komplexe Datenstruktur, die Informationen zu allen Bereichen des Programms enthält. Der Rest sammelt die in diesem Analyseobjekt (und dem abstrakten Syntaxbaum selbst) codierten Informationen und erstellt daraus ein interaktives Farbschema.
Die richtige Antwort lautet also eigentlich nicht "nein", sondern "ja, aber". Das "aber" ist ein großes: Sie müssen grundsätzlich wichtige Teile des Chrome-Browsers (und seiner Devtools) in JavaScript neu schreiben. JavaScript ist eine vollständige Turing-Sprache, das ist natürlich grundsätzlich möglich. Was unmöglich ist, ist das Ganze zu tun, ohne den gesamten Quellcode (als Zeichenfolge) zu verwenden und dann hochkomplexe Dinge damit zu tun.
quelle
Wenn Sie die Variablen nur manuell überprüfen möchten, um das Debuggen zu erleichtern, starten Sie einfach den Debugger:
debugger;
Direkt in die Browserkonsole.
quelle