我试图理解NodeJS中的递归函数,但是我仍然对以下代码和输出感到困惑:

var firstf = function () {
    var counter = 0;
    return function () {
           console.log("counter = " + counter);
           return counter += 1;
           }
    };
var add = firstf();
add();//output 0
add();//output 1
add();//output 2
firstf()();//output 0
firstf()();//output 0
firstf()();//output 0


我可以理解三个add()函数输出0,1,2,但是我不明白为什么三个firstf()()输出0,0,0。请问两个()()是什么意思?

还有一个后续问题:对于这一行:var add = firstf();
变量add将表示返回函数为:

function () {
  console.log("counter = " + counter);
  return counter += 1;
}


好的,问题是该函数如何看到变量计数器,因为计数器在上层而不在此内部函数中定义。

最佳答案

这里没有递归。递归是函数调用自身的地方。这称为关闭。因为内部函数包含对外部函数范围内变量的引用。这是一个很好的article on closures。从那篇文章:


  闭包是捆绑在一起(封闭)的功能的组合
  并参考其周围状态(词汇环境)。
  
  在
  换句话说,闭包使您可以访问外部函数的作用域
  从内部功能。在JavaScript中,每次都会创建闭包
  在函数创建时创建一个函数。要使用闭包,
  在另一个函数中定义一个函数并将其公开。
  
  暴露一个
  函数,将其返回或传递给另一个函数。内部功能
  甚至可以访问外部函数范围内的变量
  在外部函数返回之后。




现在,让我们确切地诊断firstf()()发生了什么。

首先调用firstf()。这会将内部counter初始化为0并返回一个新函数。

然后,第二个()执行该返回的函数,该函数返回counter的值为0并将其递增。

然后,您再次调用firstf()()。这会将一个新的counter变量初始化为0并返回一个新函数。然后,第二个()调用该函数并返回新的counter0,然后将其递增。

因此,这说明了为什么连续调用firstf()()总是保持返回0的原因。您每次都会制作一个新函数和一个新的计数器变量。

当您执行var add = firstf();然后调用add()时,您将存储返回的函数,然后一次又一次地调用同一函数。这将继续使用相同的内部counter变量,因此,每次内部counter变量递增时,您将看到返回值上升。


  请问两个()()是什么意思?


每个()尝试执行一个功能。在firstf()()中,第一个()执行firstf()并获取其返回的功能。然后,第二个()执行该返回的函数并获取其返回的值(计数器值)。

关于node.js - 对Node js的两个括号功能感到困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57126850/

10-13 08:02