返回函数的函数

IT技术 javascript
2021-02-10 15:55:28

我坚持“返回函数的函数”这个概念。我指的是 Stoyan Stefanov 所著的“面向对象的 Javascript”一书。

片段一:

    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()上述片段之间的区别吗?

6个回答

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

演示

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'

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

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

函数 count 可以保留在它之外定义的变量。这称为闭包。它在 JavaScript 中也被大量使用。

我被 d()(); 弄糊涂了。起初但后来意识到第一个 () 调用 d,第二个 () 调用 d 的返回值,即 e。
2021-03-15 15:55:28
八年后,这仍然是相关的!
2021-03-21 15:55:28
this仅表示函数体内的某些内容,否则它是全局的。你的意思this.sayName是你想要一个sayName不存在的全局变量,它是未定义的,所以是不可调用的。
2021-03-24 15:55:28
片段一:var hero = { name: 'Rafaelo', sayName: function() { return hero.name; }, nayName:hero.sayName } hero.nayName(); 片段二:var hero = { name: 'Rafaelo', sayName: function() { return hero.name; }, nayName:this.sayName } hero.nayName(); 第一个片段给了我正确的输出,而第二个则没有。为什么?问候。
2021-03-28 15:55:28

返回函数名而不()返回对函数的引用,可以像使用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;

()在 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;
说得好!很容易理解这个答案。
2021-03-20 15:55:28
感谢您验证有关函数是否不返回调用返回未定义值的位。我最近发现了这个问题:即使函数显式返回 null,如果您将返回的值分配给变量,它将是未定义的,而不是 null。我想这会在一些代码库中引起很多奇怪的问题,因为 null 和 undefined 并不完全等同于 ===。
2021-03-22 15:55:28
在所有答案中,我更喜欢你的答案,因为它很简单。
2021-03-24 15:55:28

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

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

返回b是返回一个函数对象。在 Javascript 中,函数只是对象,就像任何其他对象一样。如果您觉得这没有帮助,只需将“对象”一词替换为“事物”即可。您可以从函数返回任何对象。您可以返回真/假值。一个整数 (1,2,3,4...)。您可以返回一个字符串。您可以返回具有多个属性的复杂对象。你可以返回一个函数。函数只是一个东西。

在您的情况下,返回b返回事物,事物是一个可调用的函数。返回b()返回可调用函数返回的值。

考虑这个代码:

function b() {
   return 42;
}

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

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

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

尝试alert荷兰国际集团typeof(s)在您的例子。代码段 b 会给你“功能”。片段会给你什么?

第一个给出“未定义”。这是否意味着 return b() 完全没用?此外,在第二个代码段中,函数 b 是私有的。那么我们如何能够访问该函数之外的引用呢?如果可能,请给我一个链接,清楚地解释这个概念。谢谢!
2021-03-19 15:55:28
我得到了第一个的答案。在函数 b() 中返回 1+2 并且 typeof 显示数字。谢谢。
2021-03-22 15:55:28
我一定会试试的。还没有在 Javascript 中达到这个概念。也许几天后。谢谢!:)
2021-03-29 15:55:28
恭喜你弄明白了!至于私有函数:在第二个示例中它并不是真正私有的,因为您已经返回了它。事实上,它被分配给s. 尝试return this而不是return b……然后你就可以做到s.b();)
2021-04-05 15:55:28
函数 a(){ alert("A!"); function b(){ alert("B!"); } 返回 b; } var s = a(); 删除一个;s(); ----结束---- Javascript中引用的概念和Java一样吗?这里我删除了函数 a(),但调用 s() 执行 b()。那么我可以说 s 包含 b 的副本并且不指向 a() 中定义的 b() 吗?
2021-04-06 15:55:28