【问题标题】:Could I have an explanation of the syntax of this javascript closure?我可以解释一下这个 javascript 闭包的语法吗?
【发布时间】:2014-03-07 13:15:45
【问题描述】:

我最近回答了一个问题,对我来说,它提出了语法问题。我已经查看了关于 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'参数在函数定义之后的一组括号中?
如果它们是不同函数的参数,函数定义在哪里?
为什么去掉外括号后这个功能不起作用?

我想充分理解此语法,以便在其他情况下复制此代码并了解它为何有效。谢谢。

【问题讨论】:

  • 它被称为“自我唤起功能”。该函数已定义,并使用参数looploopInner 调用

标签: javascript loops for-loop syntax closures


【解决方案1】:

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

基本上它是一个立即创建并执行的函数。

在上面的代码中,函数是

  1. 创建时采用两个参数,在函数中调用 p_loopp_loopInner
  2. 立即调用并传递了两个参数 - looploopInner

这样做的目的是保留循环索引的值,以便在内部范围内可以访问正确的值。

详细解释here

【讨论】:

  • 我明白了。似乎我上一个问题的回答者实际上是向我介绍了两个新概念,而不仅仅是一个。感谢您的回答。
  • 这些在创建新范围时被大量用于保存值。看看模块模式,我在这里学到了很多关于 JavaScript 作用域的知识,并且还使用了 IIFE - 这是一个很好的参考 - adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html
【解决方案2】:

这是一个IIFE。也许通过移动括号可以帮助您了解发生了什么:

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

如我们所见,第一个表达式返回一个匿名函数,它接受p_loopp_loopInner 参数。然后使用(loop, loopInner);,我们像调用其他函数一样调用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 2011-07-27
    • 2021-09-02
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多