我可以解释一下这个javascript闭包的语法吗?

时间:2014-03-07 13:15:45

标签: javascript loops for-loop syntax closures

我最近回答了一个问题,对我来说,提出了语法问题。我已经看过关于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'参数?
如果它们是不同函数的参数,那么函数定义在哪里?
为什么在移除外支架时此功能不起作用?

我想很好地理解这种语法,所以我可以在其他情况下复制这段代码并理解为什么它有效。感谢。

2 个答案:

答案 0 :(得分:2)

这是IIFE。也许它会帮助你通过移动括号来看看发生了什么:

(function(p_loop, p_loopInner) {
    // .. code removed
})(loop, loopInner);

我们可以看到,第一个表达式返回一个带有p_loopp_loopInner参数的匿名函数。然后使用(loop, loopInner);,我们就像调用任何其他函数一样调用它。

答案 1 :(得分:2)

它们有一些不同的名称 - 自执行函数,自调用函数或立即调用函数表达式(IIFE)。

基本上它是一个立即创建和执行的功能。

在上面的代码中,函数是

    创建
  1. 以在函数中使用两个名为p_loopp_loopInner的参数。
  2. 立即调用并传递了两个参数 - looploopInner
  3. 这样做的目的是保留循环indeces的值,以便在内部范围内可以访问正确的值。

    详细解释here