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

Difference between calling an anonymous function directly vs calling it by variable?

我无法解决这个问题(假设我遗漏了一些东西,因为直接调用匿名函数或通过变量调用它是有区别的。

为什么在下面的例子中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

你有两个函数。

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

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

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

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

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

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

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

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

试试这个:

adder = adder(0)

在这里你用内部函数覆盖原始函数

在第一个示例中,您将匿名函数的结果赋值给加法器,即内部函数 + 作用域(其中总计 = 0)。

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

您需要将函数块看成是一个命名函数,因此它将是:

var adder = myfun(0);

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


Before statement is exacly the same as:

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

这就是你在做的事情。

这很简单:在示例中,您将两个不同的东西分配给 adder

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

在您的第二个示例中,您只是将匿名函数分配给 adder 而从不询问其 return 值,因此您不会在任何地方分配 inner_function 因此不能使用它。