Присвоение значений списку глобальных переменных в JavaScript

Привет, сейчас я использую 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, но ... я действительно не вижу способа исправить это ... какие-нибудь идеи?

может массив?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
2 199
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Вы можете избежать 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;'));

Это не намного лучше, хотя tbh

Вы можете вызвать эту страницу только один раз и вернуть объект json вместо текста

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

и оценить, что Поскольку теперь вы N раз вызываете свой сервер, это замедляет все, вам следует пересмотреть свою логику!

PS. когда я пишу, я видел ответ RoBorg, понимаете, при использовании новой функции вы используете eval под капотом, поэтому, если вы хотите использовать его, сделайте это (в некоторых браузерах тоже быстрее)

Использование метода jQuery each для итерации по массиву имен страниц с последующей установкой глобальной (в области окна) переменной:

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

Мне нравится jquery ... но ответ Шога - это тот, который действительно решил мою проблему: / Хотя, спасибо :)

Jiaaro 15.10.2008 22:38
Ответ принят как подходящий

Для этого вам не нужны 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)

Здесь не используется 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 раз попадать в динамический контент при каждом запросе страницы.

Большинство из этих предлагаемых решений избегают использования оценка. Эта практика еще больше усиливается в "Соглашения о коде для языка программирования JavaScript" Додуласа Крокфорда, в котором частично говорится

"eval is Evil

The eval function is the most misused feature of JavaScript. Avoid it.

eval has aliases. Do not use the Function constructor."

Другие вопросы по теме