Значения в скобках после функции 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