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:
var f = function() {
var x = 0;
console.log(x);
};
Sie können Ihre Funktion in eine Zeichenfolge konvertieren:
var s = f + '';
Sie erhalten die Funktionsquelle als Zeichenfolge
'function () {\nvar x = 0;\nconsole.log(x);\n}'
Jetzt können Sie einen Parser wie esprima verwenden , um Funktionscode zu analysieren und lokale Variablendeklarationen zu finden.
var s = 'function () {\nvar x = 0;\nconsole.log(x);\n}';
s = s.slice(12); // to remove "function () "
var esprima = require('esprima');
var result = esprima.parse(s);
und finde Objekte mit:
obj.type == "VariableDeclaration"
im Ergebnis (ich habe console.log(x)unten entfernt ):
{
"type": "Program",
"body": [
{
"type": "VariableDeclaration",
"declarations": [
{
"type": "VariableDeclarator",
"id": {
"type": "Identifier",
"name": "x"
},
"init": {
"type": "Literal",
"value": 0,
"raw": "0"
}
}
],
"kind": "var"
}
]
}
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:
var g = function() {
var y = 0;
var f = function() {
var x = 0;
console.log(x);
};
}
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.