Javascript 直接调用匿名函数和通过变量调用匿名函数之间的区别?
我很难理解这一点(假设我遗漏了一些东西,直接调用匿名函数或通过变量调用它是有区别的) 为什么在下面的示例中0设置了变量“total”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;
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),它执行并返回内部函数