理解匿名函数在javascript代码中有效

时间:2018-06-02 08:13:39

标签: javascript anonymous-function lexical-scope

当我看到一段代码并试图理解为什么称匿名时保留总值而不是其他值时,我感到有点困惑。

var adder = function (total) {
// the following function is returned 
// and assigned to adder

    var inner_function = function (summand) {
        total += summand;
        alert(total);
    }

    return inner_function;

}(0) // <- we call the annonymous function 
//    and assign the returned function to adder
adder(2); // -> 2
adder(3); // -> 5

我不明白的是,如果我不调用匿名功能,它不会保留总值。为什么?没有(0)如果我调用加法器(2)它不应该像第一次调用那样保持total的值,然后将internal_function分配给变量加法器吗?

它在博客中说 &#34;当你调用adder,即inner_function时,它可以访问由于Lexical Scoping而导致的总数,即使是具有总数的函数。 total本身是在很久以前返回的函数范围内声明的。&#34; http://pierrespring.com/2010/05/11/function-scope-and-lexical-scoping/

试图理解匿名在这种情况下是如何工作的

2 个答案:

答案 0 :(得分:1)

如果您不调用此功能,则还没有total。你的adder会引用外部函数。 adder(2)会将total绑定到2并返回内部函数(您忽略它)。 adder(3)会将total绑定到3并返回另一个内部函数(您也会忽略它)。

具体做法是:

var adder = function (total) {
    var inner_function = function (summand) {
        total += summand;
        alert(total);
    }

    return inner_function;    
};

就像

function adder(total) {
    var inner_function = function (summand) {
        total += summand;
        alert(total);
    }

    return inner_function;
}

然后

adder(2)  // returns `inner_function`
如果您不保存其返回值并调用它,则

没有明显效果。

答案 1 :(得分:1)

&#13;
&#13;
var adder = function (total) {
// the following function is returned 
// and assigned to adder

    var inner_function = function (summand) {
        total += summand;
        alert(total);
    }

    return inner_function;

}(0) // <- we call the annonymous function 
//    and assign the returned function to adder
adder(2); // -> 2
adder(3); // -> 5
&#13;
&#13;
&#13;

当你在行的末尾调用函数(0)时,你实际上正在运行外部函数(接受total的函数)并返回inner_function。因此,在通话adder包含inner_function之后。 现在,当你省略调用函数时,加法器实际上是outer_function,所以像adder(2)那样调用它不会返回值,而是返回inner_function。简单的例子:

&#13;
&#13;
var adder = function (total) {
// the following function is returned 
// and assigned to adder

    var inner_function = function (summand) {
        total += summand;
        console.log(total);
    }

    return inner_function;

}
adder(5)(2); // -> 7
&#13;
&#13;
&#13;