返回函数的函数 – Javascript

我最近开始学习JavaScript,并且坚持了'返回函数的函数'的概念。 我指的是Stoyan Stefanov所着的“Object Oriented Javascript”。 我在Java,C和C ++方面拥有过编程经验,并有两年的工作经验。

片段一:

function a() { alert('A!'); function b(){ alert('B!'); } return b(); } var s = a(); alert('break'); s(); 

输出:

 A! B! break 

片段二

 function a() { alert('A!'); function b(){ alert('B!'); } return b; } var s = a(); alert('break'); s(); 

输出:

 A! break B! 

有人可以告诉我上面的代码片段返回bb()之间的区别吗? 我试图寻找谷歌的东西,但无法得到任何有价值的链接。 如果有人也提供了一些解释这个概念的链接,我会很高兴。 感谢致敬。

给一个函数分配一个variables(没有括号)将引用复制到函数中。 将圆括号放在函数名的末尾,调用该函数,返回函数的返回值。

演示

 function a() { alert('A'); } //alerts 'A', returns undefined function b() { alert('B'); return a; } //alerts 'B', returns function a function c() { alert('C'); return a(); } //alerts 'C', alerts 'A', returns undefined alert("Function 'a' returns " + a()); alert("Function 'b' returns " + b()); alert("Function 'c' returns " + c()); 

在你的例子中,你也定义了一个函数中的函数。 如:

 function d() { function e() { alert('E'); } return e; } d()(); //alerts 'E' 

该function仍然可以调用。 它依然存在。 这一直被用于JavaScript。 函数可以像其他值一样传递。 考虑以下:

 function counter() { var count = 0; return function() { alert(count++); } } var count = counter(); count(); count(); count(); 

函数计数可以保留在其外定义的variables。 这被称为封闭。 它在JavaScript中也用了很多。

不带()返回函数名返回函数的引用,可以像var s = a()那样分配函数。 s现在包含对函数b()的引用,并且调用s()在function上等价于调用b()

 // Return a reference to the function b(). // In your example, the reference is assigned to var s return b; 

在return语句中用()调用函数将执行该函数,并返回该函数返回的任何值。 它类似于调用var x = b(); ,而不是分配b()的返回值,而是从调用函数a()返回它。 如果函数b()本身没有返回值,那么在b()完成任何其他工作之后,调用将返回undefined

 // Execute function b() and return its value return b(); // If b() has no return value, this is equivalent to calling b(), followed by // return undefined; 

return b(); 调用函数b(),并返回结果。

return b; 返回对函数b的引用,您可以将其存储在一个variables中以稍后调用。

返回b是返回一个函数对象。 在Javascript中,函数只是对象,就像任何其他对象一样。 如果你觉得没有用,只需用“东西”来代替“对象”一词。 你可以返回一个函数的任何对象。 你可以返回一个真/假的值。 一个整数(1,2,3,4 …)。 你可以返回一个string。 您可以返回具有多个属性的复杂对象。 你可以返回一个函数。 function只是一个东西。

在你的情况下,返回b返回的东西,东西是一个可调用的函数。 返回b()返回可调用函数返回的值。

考虑这个代码:

 function b() { return 42; } 

使用上面的定义, return b(); 返回值42.另一方面return b; 返回一个函数,它本身返回值为42.它们是两个不同的东西。

当你返回b ,它只是对函数b的一个引用,而不是在这个时候被执行。

当你返回b() ,你正在执行函数并返回它的值。

在您的示例中尝试alert您的typeof(s) 。 片段b将给你“function”。 什么将snippet给你?

将函数设想为一个types,就像一个int。 你可以返回一个函数中的整数。 您也可以返回函数,它们是“函数”types的对象。

现在的语法问题:因为函数返回值,你怎么能返回一个函数,而不是它的返回值?

通过省略括号! 因为没有括号,函数将不会被执行! 所以:

 return b; 

将返回“function”(想象如果你正在返回一个数字),而:

 return b(); 

首先执行函数, 然后返回执行它所得到的值,这是一个很大的区别!

创build一个variables

 var thing1 = undefined; 

声明一个函数

 function something1 () { return "Hi there, I'm number 1!"; } 

提醒thing1 (我们的第一个variables)的值:

 alert(thing1); // Outputs: "undefined". 

现在,如果我们想把thing1作为对函数something1引用 ,这意味着它和我们创build的函数是一样的,我们可以这样做:

 thing1 = something1; 

但是,如果我们想要函数的return ,那么我们必须为它分配执行函数的返回值。 您使用括号执行该function:

 thing1 = something1(); // Value of thing1: "Hi there, I'm number 1!"