2008-09-02 10 views
19

पायथन में अंतर्निहित कार्यों locals() और globals() के साथ मौजूदा क्षेत्र में सभी स्थानीय और वैश्विक चर का शब्दकोश प्राप्त हो सकता है। जावास्क्रिप्ट में ऐसा करने का कोई समकक्ष तरीका है? उदाहरण के लिए, मैं निम्नलिखित की तरह कुछ करना चाहते हैं:पाइथन के स्थानीय() के बराबर जावास्क्रिप्ट?

var foo = function(){ alert('foo'); }; 
var bar = function(){ alert('bar'); }; 

var s = 'foo'; 
locals()[s](); // alerts 'foo' 

इस सब पर संभव है, या मैं सिर्फ देखने के लिए एक स्थानीय वस्तु का उपयोग करना चाहिए?

उत्तर

15
  • स्थानीय लोगों() - नहीं।

  • वैश्विक() - हां।

window वैश्विक विस्तार के लिए एक संदर्भ, अजगर में globals() की तरह है। ,

window["foo"] 
+5

केवल ब्राउज़र या अन्य होस्ट वातावरण में जो * विंडो * लागू करता है। – RobG

+1

यह सच है। उदाहरण के लिए नोड में ऐसा करने का कोई तरीका नहीं है? मुझे लगता है कि यह तब परिवर्तन होना चाहिए, क्योंकि यह एक सामान्य जावास्क्रिप्ट उत्तर है। – sverrejoh

+4

जब कोई * विंडो * नहीं है, तो * वैश्विक * है - http://stackoverflow.com/q/10984629/596361 –

4

ठीक है, मुझे नहीं लगता कि जेएस में ऐसा कुछ है। आप हमेशा स्थानीय लोगों() के बजाय eval का उपयोग कर सकते हैं। इस तरह:

eval(s+"()"); 

तुम बस पता है कि वास्तव में foo मौजूद ढंग से काम किया है।

संपादित करें:

eval का उपयोग न करें :) का उपयोग करें:

var functionName="myFunctionName"; 
window[functionName](); 
+0

विंडो ऑब्जेक्ट का उपयोग केवल आप वैश्विक तक पहुँच, स्थानीय चर के लिए नहीं देता है:

globals()["foo"] 

के समान है। –

0

AFAIK, नहीं। तुम सिर्फ एक दिया चर के अस्तित्व की जांच करना चाहते हैं, तो आप यह इसके लिए परीक्षण, कुछ इस तरह से कर सकते हैं:

if (foo) foo(); 
+0

यह केवल तभी काम करेगा जब चर परिभाषित किया गया हो, अन्यथा यह एक संदर्भ त्रुटि फेंक देगा। –

3

मैं ब्रेंडन Eich हाल ही में एक पॉडकास्ट में इस पर टिप्पणी की याद करते हैं; अगर मैं सही ढंग से याद करता हूं, तो इसे नहीं माना जा रहा है, क्योंकि यह अनुकूलन के लिए अनुचित प्रतिबंध जोड़ता है। उन्होंने इसे arguments स्थानीय में तुलना की, जबकि वैरार्ग के लिए उपयोगी, इसका अस्तित्व अनुमान लगाने की क्षमता को हटा देता है कि इसकी परिभाषा को देखकर कोई फंक्शन क्या स्पर्श करेगा।

Btw: मेरा मानना ​​है जे एस किया तर्क एक समय में स्थानीय के माध्यम से स्थानीय लोगों तक पहुँचने के लिए समर्थन - a quick search से पता चलता हालांकि इस मान्य नहीं है।

0

@ ई-बार्टक, मुझे लगता है कि अगर आप कुछ बंद होने पर विंडो [functionName] काम नहीं करेंगे, और फ़ंक्शन का नाम उस बंद होने के लिए स्थानीय है। उदाहरण के लिए:

function foo() { 
    var bar = function() { 
     alert('hello world'); 
    }; 
    var s = 'bar'; 
    window[s](); // this won't work 
} 

इस मामले में, रों 'बार' है, लेकिन समारोह 'बार' केवल समारोह 'foo' के दायरे के अंदर मौजूद है। यह खिड़की के दायरे में परिभाषित नहीं है।

बेशक, यह वास्तव में मूल प्रश्न का उत्तर नहीं देता है, मैं बस इस प्रतिक्रिया पर झुकना चाहता था। मुझे विश्वास नहीं है कि मूल प्रश्न पूछने का एक तरीका है।

0

@pkaeding

हाँ, आप सही हैं। विंडो [functionName]() इस मामले में काम नहीं करता है, लेकिन eval करता है। अगर मुझे ऐसा कुछ चाहिए तो मैं उन कार्यों को एक साथ रखने के लिए अपनी खुद की वस्तु बनाउंगा।

var func = {}; 
func.bar = ...; 
var s = "bar"; 
func[s](); 
संबंधित मुद्दे