我最近回答了一个问题,对我来说,提出了语法问题。我已经看过关于SO的闭包的解释,但答案没有解决我在下面的具体问题。我曾尝试与向我提供答案的人讨论此事,他们建议我提出另一个问题。这是我提供的解决方案,有效,但我不明白:
for (var loop = 0;loop<onHoverSections.length;loop++) {
var extractedID = onHoverSections[loop].onHover;
for (var loopInner = 0;loopInner<sections.length;loopInner++) {
if (sections[loopInner].ID==extractedID) {
( function(p_loop, p_loopInner) {
onHoverSections[p_loop].hover(
function() {
sections[p_loopInner].trigger('onHover');
},
function() {
//
}
);
}
(loop, loopInner) );
}
}
}
我的问题涉及这部分代码:
( function(p_loop, p_loopInner) {
// .. code removed
}
(loop, loopInner) );
我的问题是:
为什么在函数定义之后的一组括号中有'loop'和'loopInner'参数?
如果它们是不同函数的参数,那么函数定义在哪里?
为什么在移除外支架时此功能不起作用?
我想很好地理解这种语法,所以我可以在其他情况下复制这段代码并理解为什么它有效。感谢。
答案 0 :(得分:2)
这是IIFE。也许它会帮助你通过移动括号来看看发生了什么:
(function(p_loop, p_loopInner) {
// .. code removed
})(loop, loopInner);
我们可以看到,第一个表达式返回一个带有p_loop
和p_loopInner
参数的匿名函数。然后使用(loop, loopInner);
,我们就像调用任何其他函数一样调用它。
答案 1 :(得分:2)
它们有一些不同的名称 - 自执行函数,自调用函数或立即调用函数表达式(IIFE)。
基本上它是一个立即创建和执行的功能。
在上面的代码中,函数是
p_loop
和p_loopInner
的参数。loop
和loopInner
这样做的目的是保留循环indeces的值,以便在内部范围内可以访问正确的值。
详细解释here