Хотя все отвечают « Нет », и я знаю, что «Нет» - правильный ответ, но если вам действительно нужно получить локальные переменные функции, существует ограниченный путь.
Рассмотрим эту функцию:
var f = function() {
var x = 0;
console.log(x);
};
Вы можете преобразовать свою функцию в строку:
var s = f + '';
Вы получите источник функции в виде строки
'function () {\nvar x = 0;\nconsole.log(x);\n}'
Теперь вы можете использовать синтаксический анализатор, такой как esprima , чтобы анализировать код функции и находить объявления локальных переменных.
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);
и найдите объекты с:
obj.type == "VariableDeclaration"
в результате (я удалил console.log(x)
ниже):
{
"type": "Program",
"body": [
{
"type": "VariableDeclaration",
"declarations": [
{
"type": "VariableDeclarator",
"id": {
"type": "Identifier",
"name": "x"
},
"init": {
"type": "Literal",
"value": 0,
"raw": "0"
}
}
],
"kind": "var"
}
]
}
Я проверял это в Chrome, Firefox и Node.
Но проблема в этом методе заключается в том, что у вас есть только переменные, определенные в самой функции. Например для этого:
var g = function() {
var y = 0;
var f = function() {
var x = 0;
console.log(x);
};
}
у вас просто есть доступ к x , а не y .
Но все же вы можете использовать цепочки caller (arguments.callee.caller.caller.caller) в цикле, чтобы найти локальные переменные функций вызывающей стороны. Если у вас есть все имена локальных переменных, значит, у вас есть переменные области действия . С именами переменных у вас есть доступ к значениям с простым eval.