retutn func() 或从 func() 返回没有 () 的 func,代码会发生什么?

function sum(a) {


  let currentSum = a;


  function f(b) {

    currentSum += b;

    return f;

   }


  f.toString = function() {

    return currentSum;

  };

  console.log(f);

  return f;

}


alert( sum(1)(2) ); // 3

alert( sum(5)(-1)(2) ); // 6

请帮助我了解 - 返回f和f()之间的区别。激活返回 f 时函数代码会发生什么情况?它是如何工作的?为什么 console.log(f) 返回一个数字?我知道 f() 返回结果,但返回 f?我不明白。


米琪卡哇伊
浏览 112回答 4
4回答

幕布斯6054654

在Javascript中,函数是第一类对象。您可以将函数视为任何其他变量或对象,并将它们传递给函数,分配给其他变量,然后(在本例中)从函数返回它们。一个可能更简单的例子来表明它可能是这样的function foo() {    console.log("foo called");}bar = foo;  // Assign the function foo to the variable bar            // Note that this doesn't actually call foobar();  // Now we call the foo function我自己在这里的例子是相当无用的,只是为了展示原理。对于更有用的示例,函数通常返回对其他函数的引用,如问题中的示例所示。

幕布斯7119047

不带 () 的函数是指向该函数的指针。我一直将它与setTimeout一起使用。function doSomething() {    console.log('something');}setTimeout(doSomething, 5000);

当年话下

每次调用 sum 函数时,总是返回函数 f 的引用。因此 sum(1) 将返回 f 的引用,而 sum(1).toString() 将返回 1 sum(1)(2) 将返回 f 的引用,而 sum(1)(2).toString() 将返回 3它不是递归,因为您只返回引用。因此,在调用它之前,不会调用该函数

慕侠2389804

碰巧的是,当您尝试控制台时.log任何值,它会调用“toString”方法。在您的实例中,您重写 toString 方法,而不是默认实现,它返回一个数字
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript