Присвоение значений списку глобальных переменных в 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;});

Как видите, мы имеем огромное нарушение принципа DRY, но...Я вообще не вижу способа это исправить...Любые идеи?

может быть массив?

Это было полезно?

Решение

Вам не нужно 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)

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

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

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

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

хотя это не намного лучше, если честно

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

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

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

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

Здесь не используется 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 является наиболее неправильной функцией JavaScript.Избегай это.

eval имеет псевдонимы.Не используйте конструктор функции. "

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top