Meskipun semua orang menjawab " Tidak " dan saya tahu bahwa "Tidak" adalah jawaban yang tepat tetapi jika Anda benar-benar perlu mendapatkan variabel lokal dari suatu fungsi ada cara terbatas.
Pertimbangkan fungsi ini:
var f = function() {
var x = 0;
console.log(x);
};
Anda dapat mengubah fungsi Anda menjadi string:
var s = f + '';
Anda akan mendapatkan sumber fungsi sebagai string
'function () {\nvar x = 0;\nconsole.log(x);\n}'
Sekarang Anda dapat menggunakan parser seperti esprima untuk mengurai kode fungsi dan menemukan deklarasi variabel lokal.
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);
dan temukan benda dengan:
obj.type == "VariableDeclaration"
dalam hasilnya (saya telah menghapus di console.log(x)bawah):
{
"type": "Program",
"body": [
{
"type": "VariableDeclaration",
"declarations": [
{
"type": "VariableDeclarator",
"id": {
"type": "Identifier",
"name": "x"
},
"init": {
"type": "Literal",
"value": 0,
"raw": "0"
}
}
],
"kind": "var"
}
]
}
Saya telah menguji ini di Chrome, Firefox dan Node.
Tetapi masalah dengan metode ini adalah Anda hanya memiliki variabel yang didefinisikan dalam fungsi itu sendiri. Misalnya untuk yang ini:
var g = function() {
var y = 0;
var f = function() {
var x = 0;
console.log(x);
};
}
Anda hanya memiliki akses ke x dan bukan y . Tetapi Anda masih dapat menggunakan rantai pemanggil (arguments.callee.caller.caller.caller) dalam satu lingkaran untuk menemukan variabel lokal fungsi pemanggil. Jika Anda memiliki semua nama variabel lokal, maka Anda memiliki variabel lingkup . Dengan nama variabel Anda memiliki akses ke nilai dengan eval sederhana.