हालाँकि हर कोई " नहीं " का जवाब देता है और मुझे पता है कि "नहीं" सही उत्तर है, लेकिन अगर आपको वास्तव में किसी फ़ंक्शन के स्थानीय चर प्राप्त करने की आवश्यकता है, तो एक प्रतिबंधित तरीका है।
इस समारोह पर विचार करें:
var f = function() {
var x = 0;
console.log(x);
};
आप अपने कार्य को स्ट्रिंग में बदल सकते हैं:
var s = f + '';
आपको स्ट्रिंग के रूप में फ़ंक्शन का स्रोत मिलेगा
'function () {\nvar x = 0;\nconsole.log(x);\n}'
अब आप एस्क्रीम की तरह एक पार्सर का उपयोग फ़ंक्शन कोड को पार्स करने और स्थानीय चर घोषणाओं को खोजने के लिए कर सकते हैं ।
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"
}
]
}
मैंने इसे क्रोम, फ़ायरफ़ॉक्स और नोड में परीक्षण किया है।
लेकिन इस विधि के साथ समस्या यह है कि आपके पास केवल फ़ंक्शन में परिभाषित चर हैं। इस एक के लिए उदाहरण के लिए:
var g = function() {
var y = 0;
var f = function() {
var x = 0;
console.log(x);
};
}
आपके पास केवल x तक पहुंच है और y नहीं । लेकिन फिर भी आप कॉलर फ़ंक्शन के स्थानीय चर खोजने के लिए एक लूप में कॉलर (आर्ग्यूमेंट्स। CCe.caller.caller.caller) की चेन का उपयोग कर सकते हैं । यदि आपके पास सभी स्थानीय चर नाम हैं, तो आपके पास गुंजाइश चर हैं । चर नामों के साथ आपके पास एक साधारण eval के साथ मूल्यों तक पहुंच है।