Mặc dù tất cả mọi người trả lời " Không " và tôi biết rằng "Không" là câu trả lời đúng nhưng nếu bạn thực sự cần lấy các biến cục bộ của hàm thì có một cách hạn chế.
Hãy xem xét chức năng này:
var f = function() {
var x = 0;
console.log(x);
};
Bạn có thể chuyển đổi chức năng của mình thành một chuỗi:
var s = f + '';
Bạn sẽ nhận được nguồn của hàm như một chuỗi
'function () {\nvar x = 0;\nconsole.log(x);\n}'
Bây giờ bạn có thể sử dụng một trình phân tích cú pháp như esprima để phân tích mã chức năng và tìm các khai báo biến cục bộ.
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);
và tìm các đối tượng với:
obj.type == "VariableDeclaration"
trong kết quả (tôi đã xóa console.log(x)bên dưới):
{
"type": "Program",
"body": [
{
"type": "VariableDeclaration",
"declarations": [
{
"type": "VariableDeclarator",
"id": {
"type": "Identifier",
"name": "x"
},
"init": {
"type": "Literal",
"value": 0,
"raw": "0"
}
}
],
"kind": "var"
}
]
}
Tôi đã thử nghiệm điều này trong Chrome, Firefox và Node.
Nhưng vấn đề với phương thức này là bạn chỉ có các biến được định nghĩa trong chính hàm đó. Ví dụ cho cái này:
var g = function() {
var y = 0;
var f = function() {
var x = 0;
console.log(x);
};
}
bạn chỉ có quyền truy cập vào x và không y . Nhưng bạn vẫn có thể sử dụng chuỗi các trình gọi (argument.callee.caller.caller.caller) trong một vòng lặp để tìm các biến cục bộ của các hàm gọi. Nếu bạn có tất cả các tên biến cục bộ để bạn có các biến phạm vi . Với các tên biến bạn có quyền truy cập vào các giá trị với một eval đơn giản.