2009-07-13 18 views
8

मूल रूप से यह एक सवाल यह है कि स्थानीय गुंजाइश हैंडलर का उपयोग करने की है। मैं वैश्विक चर परिभाषा के लिए कुछ समान प्राप्त करने की कोशिश कर रहा हूं जैसे:जावास्क्रिप्ट स्थानीय चर घोषित

window['newObject'] = "some string"; 
alert(newObject); 

लेकिन स्थानीय दायरे के लिए। अभी एकमात्र समाधान मैं evals उपयोग कर रहा है:

eval("var newObject='some string'"); 

लेकिन यह वास्तव में बदसूरत समाधान है ... सबसे अच्छा एक एक खिड़की [] समाधान में जैसे स्थानीय गुंजाइश के लिए कुछ संदर्भ का उपयोग कर की तरह होगा, लेकिन मैं कभी नहीं सुना स्थानीय गुंजाइश के लिए किसी भी संदर्भ की ... कोई भी विचार?

उदाहरण यहाँ जाता है:

function x(arg) 
{ 
    localScope[arg.name]=arg.value; 
    alert(sex); 
} 

x({name:"sex", value:"Male"}); 
+0

मैं देख रहा हूँ, क्या आपका मतलब है वहाँ एक जावास्क्रिप्ट बराबर php के "चर चर" के लिए है। http://www.php.net/manual/en/language.variables.variable.php –

+0

की संभावित डुप्लिकेट [जावास्क्रिप्ट: नाम स्ट्रिंग द्वारा स्थानीय चर गतिशील जाओ] (http://stackoverflow.com/questions/1920867/javascript -get-local-variable-गतिशील रूप से-नाम-स्ट्रिंग) –

उत्तर

1

ओके मुझे संबंधित प्रश्न मिला जो मुझे चाहिए ...

How can I access local scope dynamically in javascript?

मैं सिर्फ याद रखें कि ECMA में 262 सिर्फ एक ही रास्ता बयान (और निश्चित रूप से eval) "के साथ" का उपयोग कर गुंजाइश के लिए गतिशील रूप से स्थानीय चर जोड़ने के लिए है, यहाँ समाधान कर रहे हैं:

var x=function(obj) 
{ 

    with(obj) 
    { 
     alert(someObj); 
    } 
} 
alert(typeof someObj); 


x ({someObj:"yea"}) ; 

alert(typeof someObj); 
+1

यह 'ब्लॉक' आपको एकमात्र चीज देता है, यह है कि आपको 'अलर्ट (obj.someObj)' लिखना नहीं है।कोड की तीन अतिरिक्त लाइनों को जोड़ने की कीमत पर। –

+1

"साथ" उपयोग करने के लिए एक बुरी चीज है। देखें http://www.yuiblog.com/blog/2006/04/11/with-statement-Considered-harmful/ और https://developer.mozilla.org/En/Core_JavaScript_1.5_Guide/Object_Manipulation_Statements –

+0

हां - दोनों उन समस्याओं: पठनीयता और थोड़ा धीमी स्थानीय स्कोप एक्सेस टेम्पलेटिंग सिस्टम के साथ सस्ती है जिसे मुझे बनाना है। – Wilq32

1

मैं कुछ याद आ रही किया जाना चाहिए। आप केवल इतना करना चाहते हैं कि आप क्या करना चाहते हैं:

var newObject = 'some string'; 

? (ओपी ने प्रश्न स्पष्ट किया है)

मुझे नहीं लगता कि आप जो पूछ रहे हैं उसे करने का एक तरीका है। एक स्थानीय वस्तु के सदस्यों उपयोग करें, उदा

function doSomething(name, value) 
{ 
    var X = {}; 
    X[name] = value; 
    if (X.foo == 26) 
    alert("you apparently just called doSomething('foo',26)"); 
} 

आप $ या एक्स की तरह एक 1-चरित्र चर चुनते हैं, तो यह "लागत" आप 2 वर्ण (चर नाम के साथ साथ एक डॉट), और eval या कर कुछ अजीब का उपयोग करने की कोशिश कर टाल।

+0

हां - मैं उस कार्य को प्राप्त करने वाले डेटा के गतिशील रूप से अनुरूप करना चाहता हूं। – Wilq32

+0

मेरा मतलब है - हाँ आप वहां कुछ याद करते हैं। मुझे गतिशील रूप से परिभाषित स्थानीय चर की आवश्यकता है;) – Wilq32

0

दिलचस्प सवाल है, कुछ इस तरह कभी नहीं सोचा। लेकिन USECASE क्या है?

कारण आप ऐसा कुछ करना चाहते हैं, तो यदि आप चर के नाम को नहीं जानते हैं। लेकिन तब उस स्थिति में, एक ही रास्ता चर फिर से उसी संदर्भ ऑब्जेक्ट का उपयोग किया जाएगा तक पहुँचने के लिए। अर्थात। आप डेटा को स्टोर करने के लिए किसी पुरानी ऑब्जेक्ट का उपयोग कर सकते हैं।

ऐसी संदर्भ वस्तु से पढ़ना डीबगिंग उद्देश्यों के लिए दिलचस्प होगा, लेकिन मुझे नहीं लगता कि आप इसे क्यों लिखना चाहते हैं।

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

उदाहरण तुम्हें तैनात स्थानीय गुंजाइश के लिए उपयोग की जरूरत के लिए मुझे समझाने नहीं करता, क्योंकि आप अभी भी नाम sex कठिन चेतावनी में कोडित है। इसे कार्यान्वित किया जा सकता है:

function x(arg) 
{ 
    container = {}; 
    container[arg.name] = arg.value; 
    alert(container.sex); 
} 

क्या आप उदाहरण पर और विस्तार कर सकते हैं?

+0

उदाहरण यह सुनिश्चित करने के लिए नहीं है कि इसकी आवश्यकता है। मैं टेम्पलेट सिस्टम पर काम कर रहा हूं और समझाता हूं कि मुझे क्यों चाहिए कि इसमें बहुत समय लगेगा और वास्तव में जटिल होगा :) – Wilq32

+0

मुझे बस कॉल करने में सक्षम होना चाहिए (अलर्ट (सेक्स)) जहां परिवर्तनीय नाम बाहरी स्रोत से लिया जा सकता है;) – Wilq32

+0

आह, तो यह नीचे आता है कि आपका टेम्पलेट सिस्टम अलर्टबॉक्स में डॉट्स की अनुमति नहीं देता है? ;-) अन्यथा, 'अलर्ट (obj.someObj)' बस काम करता है। –

1

क्यों स्थानीय दायरे में कोई ऑब्जेक्ट नहीं बनाते हैं और फिर इसे किसी भी चर के लिए कंटेनर के रूप में उपयोग करते हैं जिसे आप गतिशील रूप से बनाना चाहते हैं?

function x(arg) 
{ 
    var localSpace = {}; 
    localSpace[arg.name] = arg.value; 
} 
+0

लेकिन मुझे तत्व को केवल एक नाम के रूप में संदर्भित करने में सक्षम होना चाहिए, न कि प्रत्येक चर से पहले स्थानीय स्पेस [नाम] के साथ ... – Wilq32

+0

यह आवश्यकता क्यों है? –

+0

क्योंकि तृतीय पक्ष स्थानीय स्कोप से अपने मूल्यों पर टेम्पलेट्स में संदर्भ लेना चाहते हैं ... अच्छी तरह से समझाते हुए यह वास्तव में जटिल है, लेकिन मैं आपको यह सुनिश्चित कर सकता हूं कि स्थानीय स्कोप विस्तारित होने के द्वारा ही ऐसा करने का कोई अन्य तरीका नहीं है (या वैश्विक लेकिन चर के लिए लंबी पहुंच के साथ)। – Wilq32

-1

मुझे पूरा यकीन नहीं है कि मैं आपका प्रश्न समझता हूं। जब एक वर्ग एक्स बनाने, मैं आम तौर पर ऐसा करते हैं:

function x(args) { 
    var _self = this; 

    _self.PriviledgedMethod(a) { 
     // some code 
    } 

    function privateMethod(a) { 
     // some code 
    } 
} 

var newObject = new x(args); 

के बाद से यह निहित कार्यों द्वारा को बंद रहता है आप _self और आर्ग उपयोग करने के लिए जारी रख सकते हैं।

+0

हर कीमत पर eval से बचें (कभी कभी आप नहीं कर सकते हैं)। इसे टालने से, आप बेहतर खनन संभावनाओं की अनुमति देंगे। –

+0

मैं पूरी तरह से भिन्नता के लिए पूछता हूं - स्थानीय दायरे में गतिशील रूप से एक चर बनाने के लिए कैसे - ताकि आप सतर्क (लिंग) टाइप कर सकें जहां स्थानीय क्षेत्र में 'लिंग' गतिशील रूप से बनाया गया है – Wilq32

1

आप नामित तर्क चाल की कोशिश कर सकते
संपादित करें: इस पार ब्राउज़र

function x({sex:sex, height:height}) { 
    alert(sex); 
    alert(height); 
} 

x({ sex: 'male', height: 'short' }); 
x({ height: 'medium', sex: 'female' }); 

// male 
// short 
// female 
// medium 
+0

दिलचस्प ... क्या यह ईसीएमएस्क्रिप्ट है, या सिर्फ एक विशेष बोली है ? (उदाहरण के लिए स्पाइडरमॉन्की क्योंकि यह स्पाइडरमोनकी 1.7) –

+0

के साथ काम करता प्रतीत होता है दिलचस्प .. मैं +1 जोड़ रहा हूं :) – Wilq32

+0

यह जेएस 1.7 का हिस्सा है और उसे विनाशकारी असाइनमेंट कहा जाता है। आप इस फ़ंक्शन घोषणा को सरल बना सकते हैं: फ़ंक्शन x ({sex, height}) {...} – Prestaul

6

आप के लिए कॉल वस्तु कहा जाता है देख रहे हैं क्या नहीं है। लेकिन this के अनुसार, आप इसे सीधे एक्सेस नहीं कर सकते हैं, इसलिए आप भाग्य से बाहर हैं।

+0

मैंने कभी भी _call object_ शब्द नहीं सुना है, लेकिन आपके द्वारा प्रदान किया गया लिंक उपयोगी था । यह किसी फ़ंक्शन के स्थानीय दायरे का वर्णन करने के लिए जावास्क्रिप्ट कार्यान्वयन विवरण की तरह दिखता है (जो बंद होने पर कब्जा कर लिया गया "स्थानीय" दायरा से बच सकता है)। हालांकि, मुझे नहीं लगता कि मूल प्रश्न के साथ इसका बहुत कुछ करना है। –

+0

दूसरे विचार पर, यदि आप _could_ सीधे उस कार्यान्वयन विवरण तक पहुंचते हैं, तो यह प्रश्न के लिए प्रासंगिक होगा, इसलिए आप उस सम्मान में सही हैं। –

+0

दाएं; यदि आप कर सकते हैं, तो आप वह कर सकते हैं जो वह पूछ रहा है: "लोकलस्कोप [नाम] = मूल्य;" –

1

सुनिश्चित नहीं है कि आपको वास्तव में क्या चाहिए, लेकिन यहां मेरा 2 सेंट है।

गतिशील एक मौजूदा समारोह में वार्स बनाने के लिए एक ही रास्ता eval विधि आप पहले ही उल्लेख किया गया है।

एक अन्य विकल्प (दूसरों के द्वारा उल्लेख किया) है कि अपने कार्य एक संदर्भ नक्शा, और टेम्पलेट का उपयोग यह डॉट नोटेशन (context.var1)

मेरे अंतिम सुझाव समारोह निर्माता है के साथ लेते हैं। लेकिन मुझे लगता है कि यह वही हो सकता है जो आप खोज रहे हैं। (ध्यान दें कि समारोह निर्माता एक eval कॉल के रूप में ही समस्याओं से ग्रस्त है)

var arg1 = "first"; 
var arg2 = "last"; 

// This is the body of the function that you want to execute with first 
// and last as local variables. It would come from your template 
var functionBody = "alert(first + ' ' + last)"; 

var myCustomFun = new Function(arg1, arg2, functionBody); 

myCustomFun("Mark", "Brown"); // brings up and alert saying "Mark Brown"; 

आशा है कि यह मदद करता है

संबंधित मुद्दे