javascript函数后括号中的值

时间:2013-04-03 09:04:39

标签: javascript syntax

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

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

请参阅this post中的已接受答案,以获取完整代码的参考。

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

有人可以解释一下吗?感谢。

3 个答案:

答案 0 :(得分:13)

有一个匿名函数,它会立即调用三个参数(rootnsfactory)。

  • root取值`窗口。
  • 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);

答案 1 :(得分:9)

你拥有的是一个立即调用的函数表达式(IIFE)。如果你删除所有你刚才留下的论点:

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

该函数需要三个参数:

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

你传递了三个论点:

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

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

答案 2 :(得分:1)

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

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

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

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

这两个块需要包裹在一对()内;原因在这里解释:
Explain JavaScript's encapsulated anonymous function syntax