基本Javascript:返回函数的函数

基本Javascript:返回函数的函数,javascript,Javascript,这是一个非常基本的javascript问题: 定义函数后: function a(){ alert("A!"); return function(){ alert("B!") }; } a(); var newFunc = a(); newFunc(); 如果我调用该函数: function a(){ alert("A!"); return function(){ alert("B!") }; } a();

这是一个非常基本的javascript问题:

定义函数后:

function a(){
    alert("A!");
    return function(){
        alert("B!")
    };
}
a();
var newFunc = a();
newFunc();
如果我调用该函数:

function a(){
    alert("A!");
    return function(){
        alert("B!")
    };
}
a();
var newFunc = a();
newFunc();
只有“A!”处于警戒状态; 但如果我重新创建一个新函数:

function a(){
    alert("A!");
    return function(){
        alert("B!")
    };
}
a();
var newFunc = a();
newFunc();
“A!”和“B!”都会发出警报

有人能解释一下原因吗? 百万泰铢


这是从p78、面向对象JavaScript、Stoyan Stefanov、PACKT PUBLISHING中提取的调用以下命令将执行两个警报:

a()();


正在执行函数
a
,并返回一个函数。但是您没有执行返回的函数


在第二个示例中,这正是您正在执行的操作,但分散在两行中(因此您的代码中有两个
()
)。

调用以下命令将执行两个警报:

a()();


正在执行函数
a
,并返回一个函数。但是您没有执行返回的函数


在第二个示例中,这正是您正在做的,但分布在两行中(因此,您的代码中有两个
()
)。

返回值就是--一个返回值。它没有被执行

试一下这个吧:

a = a();
a();

返回值就是一个返回值。它没有被执行

试一下这个吧:

a = a();
a();
在第一次调用a()时;您正在调用该函数,它将返回另一个函数。但你不叫它。
在第二个示例中,调用函数并将返回值(它返回的函数)存储在变量中,然后调用该变量,该变量将调用返回的函数

function a() {
  alert("A!"); //This will be called when the function a is called.
  //After the alert another function is returned:
  return function(){
    //and if this function is called, it will:
    alert("B!");
  }
}

a(); //Calls a, but do nothing with return value.  

a()(); //Calls a and directly calls the return value after.  

var b = a(); //Calls a and stores return value in variable 'b'
b(); //calls 'b', which is the return value of 'a'.
在第一次调用a()时;您正在调用该函数,它将返回另一个函数。但你不叫它。
在第二个示例中,调用函数并将返回值(它返回的函数)存储在变量中,然后调用该变量,该变量将调用返回的函数

function a() {
  alert("A!"); //This will be called when the function a is called.
  //After the alert another function is returned:
  return function(){
    //and if this function is called, it will:
    alert("B!");
  }
}

a(); //Calls a, but do nothing with return value.  

a()(); //Calls a and directly calls the return value after.  

var b = a(); //Calls a and stores return value in variable 'b'
b(); //calls 'b', which is the return value of 'a'.

这应该是相当明显的

函数的返回值不会执行,而是返回。当然,返回语句之前的任何内容都将被执行

因此本质上,代码:
var newFunc=a()
将函数
a()
(在本例中为匿名函数)的返回值指定给
newFunc
。因此,调用
newFunc()
将执行返回的匿名函数


您可以使用
var newFunc=a()()强制返回函数在赋值时运行
,它将匿名函数的返回值分配给
newFunc
(在本例中为
null
,并且警报正在运行)。

这应该是相当明显的

函数的返回值不会执行,而是返回。当然,返回语句之前的任何内容都将被执行

因此本质上,代码:
var newFunc=a()
将函数
a()
(在本例中为匿名函数)的返回值指定给
newFunc
。因此,调用
newFunc()
将执行返回的匿名函数

您可以使用
var newFunc=a()()强制返回函数在赋值时运行
,它将匿名函数的返回值分配给
newFunc
(在本例中为
null
,并运行警报)。

非常简单:

function a()
{
    alert("A!");
    return function()
    {
        alert("B!");
    };
}
a();
在这种情况下,调用
a
,其函数体将发出警报
a,然后返回一个函数。返回值(alserts B的函数)被忽略

当你写作时

var newF = a();
newF();
返回的函数被分配给
newF
,如果您调用该函数,则可以通过此变量通知B。要一次性完成所有操作,您可以轻松编写:

(a())();
很简单:

function a()
{
    alert("A!");
    return function()
    {
        alert("B!");
    };
}
a();
在这种情况下,调用
a
,其函数体将发出警报
a,然后返回一个函数。返回值(alserts B的函数)被忽略

当你写作时

var newF = a();
newF();
返回的函数被分配给
newF
,如果您调用该函数,则可以通过此变量通知B。要一次性完成所有操作,您可以轻松编写:

(a())();

第一个示例是
a()
,它执行
a
函数,该函数执行警报函数并返回函数
b
(但不执行)


第二个示例,
var newFunc=a()
,执行
a
,并将其值保存到变量
newFunc
,这意味着它现在等于
b
。然后执行newFunc,它会提醒'B!'

您的第一个示例,
a()
,执行
a
函数,该函数执行警报函数并返回函数
b
(但不执行)


第二个示例,
var newFunc=a()
,执行
a
,并将其值保存到变量
newFunc
,这意味着它现在等于
b
。然后执行newFunc,它会提醒'B!'

调用时,a会做两件事:

  • “A!”
  • 创建一个提醒“B!”的函数调用时,还返回该函数

  • 您的第一个示例,
    a()
    是对
    a
    的调用,因此它会提醒'a!',创建一个提醒“B!”的函数调用时,返回该函数并丢弃它(因为未使用返回值)

    您的第二个示例,
    var newFunc=a()
    与第一个示例类似:它是对
    a
    的调用,提醒'a!',创建通知“B!”的(其他)函数,返回函数,并将返回值分配给
    newFunc
    。现在,
    newFunc
    是对提醒“B!”的函数的引用


    最后是代码的最后一行
    newFunc()调用通知“B!”的函数

    调用时,a会做两件事:

  • “A!”
  • 创建一个提醒“B!”的函数调用时,还返回该函数

  • 您的第一个示例,
    a()
    是对
    a
    的调用,因此