14

我正在尝试重新使用我在 SO 的答案中找到的一些 Javascript 代码。但我想先更好地理解它的语法。它的大纲是:

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

有关完整代码的参考,请参阅本文中接受的答案。

我了解最终结果是如何实现的,但我不太清楚内部 (...) 块与第一个块的关系,或者它内部的逗号分隔列表告诉编译器什么。

有人可以解释吗?谢谢。

4

3 回答 3

15

有一个匿名函数采用三个参数(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's 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);
于 2013-04-03T09:08:41.347 回答
11

您所拥有的是一个立即调用的函数表达式(IIFE)。如果你去掉所有的论点,你只剩下这个:

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

该函数需要三个参数:

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

然后你传递三个参数:

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

其中一个论点,factory恰好是一个函数。

于 2013-04-03T09:07:34.397 回答
1

它创建一个接受三个参数的匿名(未命名)函数:

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

然后立即调用该函数并传递三个参数,第三个是另一个匿名函数:

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

这两个块需要包裹在一对(); 原因在这里解释:
解释JavaScript的封装匿名函数语法

于 2013-04-03T09:07:12.113 回答