直接调用匿名函数与通过变量调用它之间的区别?

时间:2016-07-27 12:08:25

标签: javascript currying

我无法绕过这个问题(假设我错过了直接调用匿名函数或通过变量调用它的区别。

为什么在下面的示例中0设置变量'total'?

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);

adder(2); // returns 2
adder(3); // returns 5

但是之后我这样称呼这个匿名函数不是吗?

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;

} 

adder(0);
adder(2); // -> 2
adder(3); // -> 5

5 个答案:

答案 0 :(得分:2)

你有两个功能。

在第一个示例中,您将外部匿名函数的返回值(即内部匿名函数)分配给adder

在第二个示例中,您将外部匿名函数指定给adder

由于adder的值在每种情况下都是不同的函数,因此会得到不同的结果。

答案 1 :(得分:1)

在你的第一段代码中,当你用'(0)'关闭函数体时,你正在调用函数。这被称为自我调用功能。因此,在两个代码示例中,您实际上都在调用函数三次。

function(){}():这也是函数声明和自我调用。

function (){}:这只是一个函数声明。

答案 2 :(得分:1)

第一个示例显示了使用立即调用的函数表达式来创建捕获传递的0的闭包。请注意,您实际上返回内部函数,然后调用它而不是原始函数。

在第二个示例中,您还创建了一个闭包并返回内部函数,但它没有被赋值给任何东西,因此后续调用以外部函数为目标并创建更多闭包。

试试这个:

adder = adder(0)

在这里,您可以使用内部函数覆盖原始函数

答案 3 :(得分:1)

在第一个示例中,您将添加匿名函数的结果,即内部函数+范围(其中total = 0)。

那是因为你在最后用(0)调用匿名函数。

你需要看到功能块,就像它是一个命名函数,所以它将是:

var adder = myfun(0);

var myfun = function(total){...}


Before statement is exacly the same as:

var adder = function(total){...}(0);

这就是你在做什么。

答案 4 :(得分:1)

这非常简单:在示例中为adder分配两个不同的内容。

在您的第一个示例中,您自行调用匿名function (total) {...},因此您将其返回值分配给adder,即inner_function

在第二个示例中,您只需将匿名函数指定给adder,并且永远不会询问其返回值,因此您不会将inner_function分配到任何位置,因此无法使用它。