Значения в скобках после функции javascript

Я пытаюсь переназначить код Javascript, который нашел в ответ на SO. Но сначала я хотел бы лучше понять его синтаксис. Его схема:

(function (root, ns, factory) {
    // some code
} (window, 'detectZoom', function() {
    // some more code
}));

См. принятый ответ в этом сообщении для ссылки на полный код.

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

Может кто-нибудь объяснить? Спасибо.

Ответ 1

Существует анонимная функция с тремя параметрами (root, ns, factory), которые немедленно вызываются.

  • root принимает значение `window.
  • ns принимает значение 'detectZoom'
  • factory принимает значение функции обратного вызова (также анонимно)

Объяснение:

(function (root, ns, factory) {
   // the body of the anonymous function
} (window, 'detectZoom', function() {
   // the body of the 'factory' callback
}));

Чтобы разбить его, как добраться до этого кода за четыре шага:

 1.
 // Anonymous function.
 (function (root, ns, factory) {/* body */});

 2.
 // Anonynmous function, immediately invoked
 (function (root, ns, factory) {/* body */})();  // parentheses mean it invoked

 3.
 // Callback as a separate argument
 var cbk = function () {};
 (function (root, ns, factory) {/* body */})(window, 'detectZoom', cbk);

 4.
 // Callback as an anonymous function
 (function (root, ns, factory) {/* body */})(window, 'detectZoom', function () {});

Вы можете переписать свой код более подробным:

var outer = function (root, ns, factory) {
  // the body
};

var callback = function () {
  // the body
};

outer(window, 'detectZoom', callback);

Ответ 2

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

(function () {
    // some code
}());

Функция ожидает три аргумента:

(function (root, ns, factory) {
    // some code
}());

И вы передаете ему три аргумента:

(function (root, ns, factory) {
    // some code
} (window, 'detectZoom', function() {
    // some more code
}));

Один из этих аргументов, factory, оказывается функцией.

Ответ 3

Создает анонимную (неназванную) функцию, которая принимает три параметра:

function (root, ns, factory) {
    // some code
}

Затем сразу вызывает эту функцию, передающую три аргумента, а третья - еще одна анонимная функция:

(window, 'detectZoom', function() {
    // some more code
})

Два блока должны быть обернуты внутри пары (); причина объясняется здесь:
Объяснить синтаксис анонимных функций, инкапсулированный JavaScript