@izheme
Познаю мир

Можете пояснить логику вызова функции по завершению асинхронной загрузки внешнего скрипта?

Добрый вечер, сообщество.

Очень часто, когда внешний скрипт загружается асинхронно, для правильного вызова функции на странице используются подобные конструкции:
(function(w, n) {
    w[n] = w[n] || [];
    w[n].push({

    // какие-то параметры

})(window, 'название_функции');

Можете рассказать, как это вообще работает?
  • Вопрос задан
  • 89 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Не нашёл, как называется такой паттерн. Попробую объяснить, как я понимаю этот код.

Во время выполнения кода неизвестно, определён ли уже глобальный объект. У глобального должен быть метод push(), принимающий пачку новых параметров. Но мы готовы к обоим вариантам: пушим или в крутой объект, или в пустой массив.

После загрузки внешнего скрипта, тот смотрит, пусто ли глобальное свойство, на которое он претендует. Если не пусто - там накопились данные для него и он их себе записывает куда надо при инициализации. Примерно так:
(function(w, n) {
  w[n] = w[n] || [];
  w[n].push({a: "A", b: "B"});
})(window, 'tosterQuery');



// в скрипте подгружаемом позже
(function(w, n) {
  // не перезаписать объкт. Только если пустой или массив.
  if (w[n] && !Array.isArray(w[n])) return;
    
  function f() {
    const data = w[n] || [];
    // определяем свой push с блекджеком
    this.push = function(x) {return data.push(x);}
    this.getData = function() {return data;}
  }
 
  w[n] = new f(); // занимаем глобальное свойство
})(window, 'tosterQuery');

tosterQuery.getData(); //  [{"a":"A","b":"B"}]
tosterQuery.push({z:"Z"});
tosterQuery.getData(); //  [{"a":"A","b":"B"}, {"z":"Z"}]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы