Bien que tout le monde réponde " Non " et je sais que "Non" est la bonne réponse, mais si vous avez vraiment besoin d'obtenir des variables locales d'une fonction, il existe un moyen restreint.
Considérez cette fonction:
var f = function() {
var x = 0;
console.log(x);
};
Vous pouvez convertir votre fonction en chaîne:
var s = f + '';
Vous obtiendrez la source de la fonction sous forme de chaîne
'function () {\nvar x = 0;\nconsole.log(x);\n}'
Vous pouvez maintenant utiliser un analyseur comme esprima pour analyser le code de fonction et trouver des déclarations de variables locales.
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);
et trouver des objets avec:
obj.type == "VariableDeclaration"
dans le résultat (j'ai supprimé console.log(x)ci-dessous):
{
"type": "Program",
"body": [
{
"type": "VariableDeclaration",
"declarations": [
{
"type": "VariableDeclarator",
"id": {
"type": "Identifier",
"name": "x"
},
"init": {
"type": "Literal",
"value": 0,
"raw": "0"
}
}
],
"kind": "var"
}
]
}
J'ai testé cela dans Chrome, Firefox et Node.
Mais le problème avec cette méthode est que vous n'avez que les variables définies dans la fonction elle-même. Par exemple pour celui-ci:
var g = function() {
var y = 0;
var f = function() {
var x = 0;
console.log(x);
};
}
vous avez juste accès au x et non au y . Mais vous pouvez toujours utiliser des chaînes d' appel (arguments.callee.caller.caller.caller) dans une boucle pour trouver des variables locales des fonctions d'appel. Si vous avez tous les noms de variables locales, vous avez donc des variables d'étendue . Avec les noms de variables, vous avez accès aux valeurs avec un simple eval.