แม้ว่าทุกคนจะตอบว่า " ไม่ " และฉันรู้ว่า "ไม่" เป็นคำตอบที่ถูกต้อง แต่ถ้าคุณต้องการได้รับตัวแปรท้องถิ่นของฟังก์ชั่นมันมีวิธีที่ จำกัด
พิจารณาฟังก์ชั่นนี้:
var f = function() {
var x = 0;
console.log(x);
};
คุณสามารถแปลงฟังก์ชั่นของคุณเป็นสตริง:
var s = f + '';
คุณจะได้รับแหล่งที่มาของฟังก์ชั่นเป็นสตริง
'function () {\nvar x = 0;\nconsole.log(x);\n}'
ตอนนี้คุณสามารถใช้ parser เช่น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 แต่คุณยังสามารถใช้กลุ่มของผู้เรียก (arguments.callee.caller.caller.caller) ในลูปเพื่อค้นหาตัวแปรโลคัลของฟังก์ชันตัวเรียก ถ้าคุณมีชื่อตัวแปรท้องถิ่นเพื่อให้คุณมีตัวแปรขอบเขต ด้วยชื่อตัวแปรคุณสามารถเข้าถึงค่าด้วย eval อย่างง่าย