我试图理解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
并返回一个新函数。然后,第二个()
调用该函数并返回新的counter
值0
,然后将其递增。
因此,这说明了为什么连续调用firstf()()
总是保持返回0
的原因。您每次都会制作一个新函数和一个新的计数器变量。
当您执行var add = firstf();
然后调用add()
时,您将存储返回的函数,然后一次又一次地调用同一函数。这将继续使用相同的内部counter
变量,因此,每次内部counter
变量递增时,您将看到返回值上升。
请问两个()()是什么意思?
每个()
尝试执行一个功能。在firstf()()
中,第一个()
执行firstf()
并获取其返回的功能。然后,第二个()
执行该返回的函数并获取其返回的值(计数器值)。
关于node.js - 对Node js的两个括号功能感到困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57126850/