تعيين قيم لقائمة المتغيرات العامة في JavaScript

StackOverflow https://stackoverflow.com/questions/201832

  •  03-07-2019
  •  | 
  •  

سؤال

مرحبًا الآن، أنا أستخدم 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;});

كما ترون، لدينا انتهاك كبير لمبدأ الجفاف، ولكن...لا أرى حقًا طريقة لإصلاحه..أيه أفكار؟

ربما مجموعة؟

هل كانت مفيدة؟

المحلول

وأنت لا تحتاج eval() أو Function() لهذا الغرض. صفيف، كما كنت المشتبه بهم، سوف قيام بهذه المهمة بشكل جيد:

(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<pages.length; ++i)
   {
      // "this" refers to the outer scope; likely the window object. 
      // And will result in page contents being stored in global variables 
      // with the same names as the pages being loaded. We use the with({})
      // construct to create a local scope for each callback with the
      // appropriate context and page name.
      with ({context: this, pageName: pages[i]})
         $.get("content.py?pageName=" + pageName, function(data)
            {context[pageName] = data;});
   }

})(); // close scope, execute anonymous function

// at this point, viewer, artists, etc. are populated with page contents 
// (assuming all requests completed successfully)

نصائح أخرى

استخدام كل طريقة من jQuery للتكرار عبر مجموعة من أسماء الصفحات ثم تعيين متغير عام (في نطاق النافذة):

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

تحديث: في الواقع، لا تحتاج حتى إلى "الوظيفة الجديدة":

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

ويمكنك تجنب وحدة التقييم باستخدام وظيفة جديدة:

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;'));

وانها ليست أفضل كثيرا رغم TBH

ويمكنك الاتصال مرة واحدة فقط تلك الصفحة، والعودة كائن سلمان بدلا من النص

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

وحدة التقييم والتي منذ الآن أنت تدعو N مرات الخادم الخاص بك، وهذا يبطئ كل شيء، يجب أن تعيد النظر في المنطق الخاص بك!

وPS. وأنا أكتب رأيت الجواب RoBorg، كما ترى، عند استخدام وظيفة جديدة كنت تستخدم وحدة التقييم تحت غطاء محرك السيارة، لذلك إذا كنت ترغب في استخدامها لأنها تذهب (في بعض المتصفح هو أسرع جدا)

وهذا لا تستخدم وحدة التقييم، على الرغم من أنها أكثر قليلا الالفاظ.

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]);

ولكن واحدا من من answerers حرصت جيدة، ربما يجب عليك محاولة الجمع بين كل هذه الطلبات إلى واحد وإلا سيتم ضرب الخادم الخاص بك 6 مرات عن محتوى ديناميكي على كل طلب من الصفحة.

تتجنب معظم هذه الحلول المقترحة استخدام تقييم.وقد تم تعزيز هذه الممارسة بشكل أكبر في كتاب دودوغلاس كروكفورد " اتفاقيات التعليمات البرمجية للغة برمجة جافا سكريبت"الذي يقول في جزء منه

"التقييم هو الشر

وظيفة eval هي الميزة الأكثر إساءة استخدامها في JavaScript.تجنبه.

eval له أسماء مستعارة.لا تستخدم منشئ الوظائف. "

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top