为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

米琪卡哇伊 2022-08-04 10:30:26
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) ); // 3alert( sum(5)(-1)(2) ); // 6请帮助我了解 - 返回f和f()之间的区别。激活返回 f 时函数代码会发生什么情况?它是如何工作的?为什么 console.log(f) 返回一个数字?我知道 f() 返回结果,但返回 f?我不明白。
查看完整描述

4 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

在Javascript中,函数是第一类对象。您可以将函数视为任何其他变量或对象,并将它们传递给函数,分配给其他变量,然后(在本例中)从函数返回它们。


一个可能更简单的例子来表明它可能是这样的


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

我自己在这里的例子是相当无用的,只是为了展示原理。对于更有用的示例,函数通常返回对其他函数的引用,如问题中的示例所示。


查看完整回答
反对 回复 2022-08-04
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

不带 () 的函数是指向该函数的指针。我一直将它与setTimeout一起使用。


function doSomething() {

    console.log('something');

}


setTimeout(doSomething, 5000);


查看完整回答
反对 回复 2022-08-04
?
当年话下

TA贡献1890条经验 获得超9个赞

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

它不是递归,因为您只返回引用。因此,在调用它之前,不会调用该函数


查看完整回答
反对 回复 2022-08-04
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

碰巧的是,当您尝试控制台时.log任何值,它会调用“toString”方法。

在您的实例中,您重写 toString 方法,而不是默认实现,它返回一个数字


查看完整回答
反对 回复 2022-08-04
  • 4 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信