Herkes " Hayır " cevabını verse de , "Hayır" ın doğru cevap olduğunu bilsem de, eğer gerçekten bir fonksiyonun yerel değişkenlerini almanız gerekiyorsa sınırlı bir yol vardır.
Bu işlevi göz önünde bulundurun:
var f = function() {
var x = 0;
console.log(x);
};
İşlevinizi bir dizeye dönüştürebilirsiniz:
var s = f + '';
Dize olarak işlev kaynağını alırsınız
'function () {\nvar x = 0;\nconsole.log(x);\n}'
Artık işlev kodunu ayrıştırmak ve yerel değişken bildirimlerini bulmak için esprima gibi bir ayrıştırıcı kullanabilirsiniz .
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);
ve aşağıdakileri içeren nesneleri bul:
obj.type == "VariableDeclaration"
sonuçta ( console.log(x)
aşağıda kaldırdım ):
{
"type": "Program",
"body": [
{
"type": "VariableDeclaration",
"declarations": [
{
"type": "VariableDeclarator",
"id": {
"type": "Identifier",
"name": "x"
},
"init": {
"type": "Literal",
"value": 0,
"raw": "0"
}
}
],
"kind": "var"
}
]
}
Bunu Chrome, Firefox ve Node'da test ettim.
Ancak bu yöntemin sorunu , işlevin kendisinde tanımlanan değişkenlere sahip olmanızdır. Örneğin bunun için:
var g = function() {
var y = 0;
var f = function() {
var x = 0;
console.log(x);
};
}
y'ye değil , x'e erişebilirsiniz . Ancak , arayan işlevlerinin yerel değişkenlerini bulmak için hala bir döngüde arayan zincirlerini (arguments.callee.caller.caller.caller) kullanabilirsiniz . Tüm yerel değişken adlarına sahipseniz, kapsam değişkenlerine sahip olursunuz . Değişken adları ile basit bir değerlendirme ile değerlere erişebilirsiniz.