返回函数的函数 – 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!
有人可以告诉我上面的代码片段返回b
和b()
之间的区别吗? 我试图寻找谷歌的东西,但无法得到任何有价值的链接。 如果有人也提供了一些解释这个概念的链接,我会很高兴。 感谢致敬。
给一个函数分配一个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!"