Javascript retutn func()或从func()返回不带()的func,代码会发生什么情况?

Javascript retutn func()或从func()返回不带()的func,代码会发生什么情况?,javascript,function,return,Javascript,Function,Return,请帮助我理解-return f和f()之间的区别。函数会发生什么 激活返回f时的代码?它是如何工作的?为什么console.log(f)返回一个数字?我知道f()返回 结果,但返回f? 我不明白。当您尝试console.log任何值时,它会调用“toString”方法 在您的实例中,您重写了toString方法,而不是默认实现,它在Javascript函数中返回一个数字。您可以像对待任何其他变量或对象一样对待函数,将它们传递给函数,分配给其他变量,然后(在本例中)从函数返回它们 一个可能更简单的

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

当您尝试console.log任何值时,它会调用“toString”方法


在您的实例中,您重写了toString方法,而不是默认实现,它在Javascript函数中返回一个数字。您可以像对待任何其他变量或对象一样对待函数,将它们传递给函数,分配给其他变量,然后(在本例中)从函数返回它们

一个可能更简单的例子可能是

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
我自己的例子是毫无用处的,只是为了说明原理。对于一个更有用的示例,函数返回对其他函数的引用是很常见的,如问题中的示例。

没有()的函数是指向该函数的指针。我一直使用setTimeout

function foo() {
    console.log("foo called");
}

bar = foo;  // Assign the function foo to the variable bar
            // Note that this doesn't actually call foo

bar();  // Now we call the foo function

每次调用sum函数时,总是返回函数f的引用。 因此sum(1)将返回f的引用,而sum(1).toString()将返回1 sum(1)(2)将返回f的引用,而sum(1)(2)。toString()将返回3


它不是递归,因为您只返回引用。因此,除非您调用它,否则不会调用该函数。

使用浏览器开发工具中的断点调试,并观察代码中发生的情况。我尝试过,但不理解。为什么需要它呢?没有()的retunr函数我仍然不明白返回f后函数代码会发生什么?它看起来像递归吗?非常困难((((
function doSomething() {
    console.log('something');
}

setTimeout(doSomething, 5000);