2012-06-15 8 views
6

के साथ eval() का उपयोग करना का आह्वान करते समय वैश्विक के लिए उपयोग करने के लिए कौन सा ऑब्जेक्ट निर्दिष्ट करने का कोई तरीका है?एक कस्टम वैश्विक

(मैं कैसे वैश्विक eval() नहीं करने के लिए पूछ रहा हूँ।)

यह काम नहीं कर रहा है, लेकिन इस दिखाता है कि मैं क्या करना चाहते हैं:

var pseudoGlobal = {}; 
eval("x = 12", pseudoGlobal); 
pseudoGlobal.x; // 12 

मुद्दा यह है कि वास्तविक वैश्विक बाइंडिंग हो रहा है अंतर्निहित परिवर्तनीय घोषणा (यानी var कीवर्ड) कोड eval() 'ed में) से प्रभावित नहीं है।

eval.call(pseudoGlobal, "x=12") या eval.apply(pseudoGlobal, ["x=12"]) के लिए, कुछ दुभाषिया इसे अनुमति नहीं देंगे।

+1

इरादा जावास्क्रिप्ट के भीतर एक पृथक/नियंत्रित/सुरक्षित निष्पादन वातावरण बनाना है। – gawi

उत्तर

3

आप, ज़ाहिर है, विकल्प डिफ़ॉल्ट वस्तु के लिए एक प्रॉपर्टी बनाने के लिए बताए कर सकते हैं एक संपत्ति के मूल्य, जैसे

में
with (pseudoGlobal) eval("x=12") 

लेकिन नहीं। यदि निष्पादन संदर्भों के वर्तमान ढेर में कोई संपत्ति नहीं मिली है, तो यह वैश्विक वस्तु में बनाई गई है। यही सब है इसके लिए। आप कुछ अजीब बातें भी कोशिश कर सकते हैं,:

var globalvars = {}; 
for (i in this) 
    globalvars[i] = this[i]; 
with (globalvars) 
    eval("x=12") 

इस तरह से बाइंडिंग globalvars में बदल जाएगा:

//global code 
var globalvars = {}; 
for (i in this) 
    globalvars[i] = null; 
with (pseudoGlobal) 
    eval("x=12") 
for (i in this) 
    if (!(i in globalvars)) 
{ 
    pseudoGlobal[i] = this[i]; 
    delete this[i]; 
} 

आप वैश्विक बाइंडिंग के बारे में परवाह है, तो कोशिश करते हैं। ध्यान दें, कि उथली प्रतिलिपि केवल एक स्तर के बिंगिंग को बदलने के लिए रोक देगा।

+0

आपके दूसरे कोड ब्लॉक के संबंध में, यह वास्तविक वैश्विक ऑब्जेक्ट में बाइबिल को बदलने के लिए स्क्रिप्ट को रोकता नहीं है। – gawi

+0

मैंने आपके प्रश्न को अंकित मूल्य पर लिया, लेकिन अभी भी सभी खो गए नहीं हैं ... उत्तर –

+0

अपडेट किया गया है और यदि मैं 'eval ('" सख्त उपयोग करें'; '+ कोड)' करता हूं, जबकि यह कोड को बाधित करता है जो eval() 'ed, यह वैश्विक दायरे में अतिरिक्त बाइंडिंग से बनने से रोकता है। यह हमें स्तर -2 + बाइंडिंग के संभावित उत्परिवर्तन के साथ छोड़ देता है। – gawi

1

ऐसा करने के लिए कोई अंतर्निहित तरीका नहीं है।

  • उपसर्ग eval एड कोड में सभी कार्य:

    दो समाधान जो मन में आ रहे हैं। यानी, x = 12 के बजाय, आपको o.x = 12 जैसे कुछ करना होगा।

  • अपना खुद का जावास्क्रिप्ट दुभाषिया लिखें जो स्क्रिप्ट को सैंडबॉक्स करता है और सभी असाइन किए गए चर के साथ ऑब्जेक्ट देता है।
+0

बहुत बुरा हम जावास्क्रिप्ट के साथ अपना स्वयं का निष्पादन वातावरण नहीं बना सकते हैं। जावास्क्रिप्ट को रोकने के लिए कुछ अच्छा कारण मौजूद होना चाहिए। मुझे लगता है कि यह मेरे विचार से थोड़ा अधिक जटिल है (प्रोटोटाइप चेन? कन्स्ट्रक्टर्स? मूल कार्य?)। – gawi