Какие аргументы этой фабрике javascript назначены? - PullRequest
4 голосов
/ 16 апреля 2019

Я пытаюсь понять, как работает этот шаблон JavaScript, это целая библиотека, заключенная в скобки. Насколько я понимаю, скобки - это способ определения области переменных, но внутри есть единственная функция, которая принимает аргумент (глобальный, фабричный).

Я пытался найти, как работает этот шаблон, но ничего не могу найти.

Тело кода возвращает объект, который можно использовать в другом месте, но я не понимаю, для чего предназначены аргументы global и factory.

Я читал о вложениях и анонимных функциях, но не могу найти ничего о вложении, определенном следующим образом.

(function (global, factory) {
    global.className = factory();
    }  (this, function () {
         ObjectName.prototype = function() {
             /* some code */
         }
         var data = {
              getUsefulData: function(obj) {
                   return new ObjectName(obj, 'usefuldata');
              }
         }
        return data;
    })
);

Вопросы:

  • что будет, если внешняя функция не имеет аргументов?
  • какое значение здесь присваивается глобальным переменным и переменным?

1 Ответ

6 голосов
/ 16 апреля 2019

То, что вы видите, это IIFE (выражение для немедленного вызова функции) с двумя параметрами. Рассмотрим этот пример:

const x = (function(a, b) { return a + b; })(5, 6); // x === 11

Параметру global присваивается аргумент this (который при использовании на верхнем уровне является универсальным способом достижения глобального объекта , window для браузеров и global для узла .js ), второму параметру factory присваивается большая (вторая) функция.

Затем IIFE помещает результат функции factory (которая фактически является библиотечным кодом) в глобальный объект под ключом className (также называемым в этом шаблоне пространством имен).


Это разновидность шаблона модуля раскрытия , только то, что возвращается из функции factory, будет помещено в global.className, что позволяет вам иметь «частные» переменные и функции, которые не будут выставлены, но все еще доступны для «публичных» объектов.

(function(global, factory) {
  global.myModule = factory();
}(this, function() {
  const privateMessage = 'secret';
  function secret() {
    return privateMessage;
  }

  function open() {
    return 'Message: ' + secret();
  }

  return { open };
}));

window.myModule.open(); // Message: secret
// no way to directly access privateMessage or secret().
...