我正在尝试重新设定我在SO上的答案中找到的一些Javascript代码。但我想首先更好地理解它的语法。它的大纲是:
(function (root, ns, factory) {
// some code
} (window, 'detectZoom', function() {
// some more code
}));
请参阅this post中的已接受答案,以获取完整代码的参考。
我理解最终结果是如何实现的,但我不太清楚内部(...)块如何与第一个相关,或者它内部的逗号分隔列表告诉编译器。
有人可以解释一下吗?感谢。
答案 0 :(得分:13)
有一个匿名函数,它会立即调用三个参数(root
,ns
,factory
)。
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