Chociaż wszyscy odpowiadają „ Nie ” i wiem, że „Nie” jest właściwą odpowiedzią, ale jeśli naprawdę potrzebujesz uzyskać lokalne zmienne funkcji, istnieje ograniczony sposób.
Rozważ tę funkcję:
var f = function() {
var x = 0;
console.log(x);
};
Możesz przekonwertować swoją funkcję na ciąg:
var s = f + '';
Otrzymasz źródło funkcji jako ciąg
'function () {\nvar x = 0;\nconsole.log(x);\n}'
Teraz możesz używać analizatora składni, takiego jak esprima, do analizowania kodu funkcji i znajdowania deklaracji zmiennych lokalnych.
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);
i znajdź obiekty za pomocą:
obj.type == "VariableDeclaration"
w wyniku (usunąłem console.log(x)poniżej):
{
"type": "Program",
"body": [
{
"type": "VariableDeclaration",
"declarations": [
{
"type": "VariableDeclarator",
"id": {
"type": "Identifier",
"name": "x"
},
"init": {
"type": "Literal",
"value": 0,
"raw": "0"
}
}
],
"kind": "var"
}
]
}
Przetestowałem to w Chrome, Firefox i Node.
Ale problem tej metody jest to, że po prostu mają zmienne zdefiniowane w samej funkcji. Na przykład dla tego:
var g = function() {
var y = 0;
var f = function() {
var x = 0;
console.log(x);
};
}
masz tylko dostęp do x, a nie y . Ale nadal możesz używać łańcuchów wywołujących (arguments.callee.caller.caller.caller) w pętli, aby znaleźć lokalne zmienne funkcji wywołujących. Jeśli masz wszystkie lokalne nazwy zmiennych, więc masz zmienne zakresu . Dzięki nazwom zmiennych masz dostęp do wartości za pomocą prostej ewaluacji.