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

Javascript 直接调用匿名函数和通过变量调用匿名函数之间的区别?,javascript,currying,Javascript,Currying,我很难理解这一点(假设我遗漏了一些东西,直接调用匿名函数或通过变量调用它是有区别的) 为什么在下面的示例中0设置了变量“total” var adder = function (total) { // the following function is returned // and assigned to adder var inner_function = function (summand) { total += summand;

我很难理解这一点(假设我遗漏了一些东西,直接调用匿名函数或通过变量调用它是有区别的)

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

你有两个功能


在第一个示例中,将外部匿名函数的返回值(即内部匿名函数)指定给
加法器

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


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

有两个函数


在第一个示例中,将外部匿名函数的返回值(即内部匿名函数)指定给
加法器

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


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

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

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


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

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

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


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

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

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

试试这个:

adder=加法器(0)


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

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

试试这个:

adder=加法器(0)


在这里,您使用内部函数覆盖原始函数。在第一个示例中,您将匿名函数的结果相加,即内部函数+作用域(其中total=0)

这是因为您调用的匿名函数末尾有(0)

您需要像查看命名函数一样查看函数块,因此它应该是:

var adder = myfun(0);

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


Before statement is exacly the same as:

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

这就是您要做的。

在第一个示例中,您需要添加匿名函数的结果,即内部函数+作用域(其中total=0)

这是因为您调用的匿名函数末尾有(0)

您需要像查看命名函数一样查看函数块,因此它应该是:

var adder = myfun(0);

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


Before statement is exacly the same as:

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

这就是你要做的。

这很简单:在你的例子中,你给加法器分配了两个不同的东西

在第一个示例中,您自行调用匿名
函数(total){…}
,因此将其返回值分配给
加法器
,即
内部函数


在第二个示例中,您只需将匿名函数分配给加法器,而从不要求其返回值,因此您不在任何地方分配内部函数,因此无法使用它。

这非常简单:在示例中,您将两个不同的东西分配给加法器

在第一个示例中,您自行调用匿名
函数(total){…}
,因此将其返回值分配给
加法器
,即
内部函数


在第二个示例中,您只需将匿名函数分配给
加法器
,而从不要求其返回值,因此您不在任何地方分配
内部函数
,因此无法使用它。

您可以一次又一次地重复使用变量……您确定您的第二个示例提醒了什么吗?。此外,如果您希望添加值,请保留一份副本我现在理解了我的错误,在第一段代码中,结果会立即返回给变量“加法器”,而在调用加法器(0)时,结果不会存储在任何地方,函数只会被调用。在第二段代码中,我会这样做:加法器=加法器(0)第二段代码也能很好地工作。你可以一次又一次地重复使用一个变量……你确定你的第二个示例会提醒你什么吗?另外,如果你想添加值,请保留一份当前值的副本并更新该值。我现在理解了我的错误,在第一段代码中,结果会立即返回给变量“加法器”,而当调用加法器(0)时,结果不会存储在任何地方,函数只是被调用。在第二段代码中,我会做:加法器=加法器(0)第二段代码也工作得很好,这是已经说过的…这是已经说过的…我不明白的是,在第一段代码中,我调用函数(使用立即调用的(0),它执行并返回内部函数