जावास्क्रिप्ट में वैश्विक चर की सूची में मूल्यों को असाइन करना

अरे अभी मैं jQuery का उपयोग कर रहा हूं और मेरे पास कुछ प्रीलोडेड AJAX सामान रखने के लिए कुछ वैश्विक चर हैं (पृष्ठ को अच्छे और तेज़ बनाने के लिए प्रीलोड किया गया है):


$.get("content.py?pageName=viewer", function(data)
    {viewer = data;});
$.get("content.py?pageName=artists", function(data)
    {artists = data;});
$.get("content.py?pageName=instores", function(data)
    {instores = data;});
$.get("content.py?pageName=specs", function(data)
    {specs = data;});
$.get("content.py?pageName=about", function(data)
    {about = data;});

जैसा कि आप देख सकते हैं, हमारे पास DRY सिद्धांत का एक बड़ा उल्लंघन है, लेकिन ... मुझे वास्तव में इसे ठीक करने का कोई तरीका नहीं दिख रहा है ... कोई विचार?

शायद एक सरणी?

1

6 उत्तर

JQuery नाम का उपयोग प्रत्येक पृष्ठ के नामों के सरणी के माध्यम से फिर से करने के लिए और फिर वैश्विक (विंडो स्कोप में) चर सेट करने के लिए:

jQuery.each(
    ["viewer", "artists", "instores", "specs", "about"],
    function (page) {
        $.get("content.py?pageName=" + page,
            new Function("window[" + page + "] = arguments[0]"));
    }
);

Update: Actually, you don't even need the "new Function":

jQuery.each(
    ["viewer", "artists", "instores", "specs", "about"],
    function (page) {
        $.get("content.py?pageName=" + page, function() { window[page] = arguments[0]; });
    }
);
6
जोड़ा
मुझे jQuery पसंद है ... लेकिन शोग का जवाब वह है जिसने वास्तव में मेरी समस्या हल की:/धन्यवाद हालांकि :)
जोड़ा लेखक Jiaaro, स्रोत
JQuery.each() का अच्छा उपयोग!
जोड़ा लेखक Shog9, स्रोत

इसके लिए आपको eval() या फ़ंक्शन() की आवश्यकता नहीं है। जैसा कि आपको संदेह है, एक सरणी, अच्छी तरह से नौकरी करेगी:

(function()//keep outer scope clean
{
  //pages to load. Each name is used both for the request and the name
  //of the property to store the result in (so keep them valid identifiers
  //unless you want to use window['my funky page'] to retrieve them)
   var pages = ['viewer', 'artists', 'instores', 'specs', 'about'];

   for (var i=0; i
5
जोड़ा

आप नए फंक्शन का उपयोग करके eval से बच सकते हैं:

var names = ['viewer', 'artists', 'instores', 'specs', 'about'];
for (var i = 0; i < names.length; i++)
   $.get("content.py?pageName=" + names[i], new Function('data', names[i] + ' = data;'));

हालांकि यह बहुत बेहतर नहीं है

2
जोड़ा

इनमें से अधिकतर प्रस्तावित समाधान eval के उपयोग से बचते हैं। उस अभ्यास को डोडग्लास क्रॉकफोर्ड के " जावास्क्रिप्ट प्रोग्रामिंग भाषा के लिए कोड सम्मेलन " में और अधिक मजबूती मिली है, जो कहता है अंश

"eval ईविल है

     

eval function सबसे दुरुपयोग है   जावास्क्रिप्ट की सुविधा। इससे बचें।

     

eval उपनाम है। का प्रयोग न करें   फंक्शन कन्स्ट्रक्टर। "

0
जोड़ा

आप उस पृष्ठ पर केवल एक बार कॉल कर सकते हैं, और पाठ के बजाय एक जेसन ऑब्जेक्ट लौट सकते हैं

{
viewer:'me',
artists:'you',
instores:'instores',
specs:'specs',
about:'about'
}

और उसे eval अब से आप अपने सर्वर को एन बार कॉल कर रहे हैं, यह सब धीमा हो गया है, आपको अपने तर्क पर पुनर्विचार करना चाहिए!

पुनश्च। जैसा कि मैंने लिखा है कि मैंने RoBorg उत्तर देखा, आप देखते हैं, नए फ़ंक्शन का उपयोग करते समय आप हुड के नीचे eval का उपयोग कर रहे हैं, इसलिए यदि आप इसका उपयोग करना चाहते हैं तो इसके लिए जाएं (कुछ ब्राउज़र में भी तेज़ है)

0
जोड़ा

यह eval का उपयोग नहीं करता है, हालांकि यह थोड़ा और शब्दशः है।

function get_content(name){
   $.get("content.py?pageName=" + name, function(data){ window[name] = data;});
}

var names = ['viewer', 'artists', 'instores', 'specs', 'about'];
for (var i = 0; i < names.length; i++)
    get_content(names[i]);

लेकिन उत्तरदाताओं में से एक ने एक अच्छा मुद्दा बना दिया है, आपको शायद इन सभी अनुरोधों को एक दूसरे से जोड़ने और गठबंधन करना चाहिए अन्यथा आपके सर्वर पृष्ठ के प्रत्येक अनुरोध पर गतिशील सामग्री के लिए 6 बार मारा जाएगा।

0
जोड़ा