Хоча всі відповідають " Ні ", і я знаю, що "Ні" - це правильна відповідь, але якщо вам дійсно потрібно отримати локальні змінні функції, існує обмежений шлях.
Розглянемо цю функцію:
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 . Але все ж ви можете використовувати ланцюги виклику (argument.callee.caller.caller.caller) у циклі, щоб знайти локальні змінні функції виклику. Якщо у вас є всі локальні імена змінних, значить, у вас є змінні області . Імена змінних у вас є доступ до значень з простим eval.