返回函数的函数

Caf*_*dor 98 javascript

我坚持使用'返回函数的函数'这个概念.我指的是Stoyan Stefanov撰写的"面向对象的Javascript"一书.

片段一:

    function a() {
      
        alert('A!');
    
        function b(){
            alert('B!'); 
        }
    
        return b();
    }
    
    var s = a();
    alert('break');
    s();
Run Code Online (Sandbox Code Playgroud)

输出:

A!
B!
break
Run Code Online (Sandbox Code Playgroud)

小片二

function a() {
  
    alert('A!');

    function b(){
        alert('B!'); 
    }

    return b;
}

var s = a();
alert('break');
s();
Run Code Online (Sandbox Code Playgroud)
输出:

A!
break
B!
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我返回bb()上面的片段之间的区别吗?

kzh*_*kzh 107

将变量赋值给函数(不带括号)会复制对函数的引用.将括号放在函数名的末尾,调用函数,返回函数返回值.

演示

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());
Run Code Online (Sandbox Code Playgroud)

在您的示例中,您还在函数中定义函数.如:

function d() {
    function e() {
        alert('E');
    }
    return e;
}
d()();
//alerts 'E'
Run Code Online (Sandbox Code Playgroud)

该函数仍可调用.它仍然存在.这在JavaScript中一直使用.函数可以绕过只是像其他值.考虑以下:

function counter() {
    var count = 0;
    return function() {
        alert(count++);
    }
}
var count = counter();
count();
count();
count();
Run Code Online (Sandbox Code Playgroud)

函数计数可以保留在其外部定义的变量.这称为闭包.它在JavaScript中也经常使用.

  • 我对d()()感到困惑; 起初但后来意识到first()调用d而second()调用d's返回值,即e. (7认同)
  • 八年后,这仍然具有现实意义! (2认同)

Mic*_*ski 43

返回函数名称而不()返回对函数的引用,该引用可以像您一样分配var s = a().s现在包含对函数的引用b(),并且调用s()在功能上等同于调用b().

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

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

// 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;
Run Code Online (Sandbox Code Playgroud)

  • 在所有答案中,我更喜欢你的答案,因为它很简单。 (2认同)

Abd*_*bdo 33

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

return b; 返回对函数b的引用,您可以将其存储在变量中以便稍后调用.


Che*_*eso 16

返回b是返回一个函数对象.在Javascript中,函数只是对象,就像任何其他对象一样.如果您发现没有帮助,只需将"对象"替换为"对象"即可.您可以从函数返回任何对象.您可以返回true/false值.整数(1,2,3,4 ......).你可以返回一个字符串.您可以返回具有多个属性的复杂对象.你可以返回一个功能.功能只是一件事.

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

考虑以下代码:

function b() {
   return 42;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 它应该返回'42`;) (4认同)
  • D'哦!我在想什么? (4认同)

vzw*_*ick 7

当你返回时b,它只是对函数b的引用,但此时并没有被执行。

当您 return 时b(),您正在执行该函数并返回其结果。

尝试alerttypeof(s)你的例子中。片段 b 将为您提供“功能”。片段 a 会给你什么?


Fir*_*DoL 5

将函数想象为一种类型,如 int。您可以在函数中返回整数。您也可以返回函数,它们是“function”类型的对象。

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

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

return b;
Run Code Online (Sandbox Code Playgroud)

将返回“函数”(想象一下,如果您返回一个数字),同时:

return b();
Run Code Online (Sandbox Code Playgroud)

先执行函数,然后返回执行得到的值,差别很大!