递增并存储一个“;私人的“;使用闭包的变量

Incrementing and storing a "private" variable using closures

本文关键字:变量 闭包 一个 存储      更新时间:2024-01-02

我对存储和重用局部变量的概念很着迷,即使在函数执行和退出之后也是如此,而这仅仅是通过代码体系结构(作用域)实现的。

我正在处理这个问题,并进行了一个练习,其中一个变量(vare)应该递增并在下次重复使用。它最终会递增,但不会保存,并返回到10。

var sumFunc = function(a,b){
var c = a+b;
var e = 10;
function subFunction(){
     var d = c + e;
     e++;
     return d;           
}
return subFunction();
};
var result = sumFunc(2,3);
console.log(result); //15 
console.log(result); //15 instead of 16
console.log(result); //15 instead of 17
console.log(result); //15 instead of 18

每次调用这种构造时,究竟发生了什么,我们能按部就班地遵循流程吗?

以下是我的一些想法&假设,如果这些是错误的,请告诉我:

  1. 我通过一个变量引用了这个函数,以排除这个变量被篡改的可能性。我被垃圾收集器吓坏了,我想这就是他们睡前告诉顽皮程序员的。

  2. 然而,如果我只是简单地运行,行为似乎不会改变console.log(sumFunc(2,3));

  3. 我最终故意返回subFunction,就像我在研究的开始一样,并希望尽可能地保持简单。我意识到我可能会返回一个匿名函数(return function()),然后返回d,但此时我避免了这种情况。在我看来,这个代码做了完全相同的事情,但我觉得它对我来说更清楚,我对它有更好的控制

  4. 我发现自调用函数可能会有所帮助,但我不想在这里使用它(假设这不是我设计的立即更改计数器的一部分)。

问题是您正在调用return subFunction();其基本上返回一个值。所以,无论您记录结果的次数如何,它都是相同的,而不是您可以这样做。

var sumFunc = function(a,b){
var c = a+b;
var e = 10;
function subFunction(){
     var d = c + e;
     e++;
     return d;           
}
return subFunction;
};
var result = sumFunc(2,3);
console.log(result()); //15 
console.log(result()); //16
console.log(result()); //17
console.log(result()); //18

3.我故意在最后返回subFunction返回subFunction结果。要返回函数,您只需要返回subFunction;没有括号。

之后,您需要调用它,所以console.log(result());

带有函数调用的版本

var sumFunc = function(a,b){
var c = a+b;
var e = 10;
function subFunction(){
     var d = c + e;
     e++;
     return d;           
}
return subFunction();//function call
};
var result = sumFunc(2,3);//call sumFunc and imidiately call subFunction
//result contains 15, not pointer to function
console.log(result); //15 
console.log(result); //15 instead of 16
console.log(result); //15 instead of 17
console.log(result); //15 instead of 18

带有功能指针的版本

var sumFunc = function(a,b){
var c = a+b;
var e = 10;
function subFunction(){
     var d = c + e;
     e++;
     return d;           
}
return subFunction;//return function pointer
};
var result = sumFunc(2,3);//call sumFunc and return pointer to subFunction
//result contains pointer to function
console.log(result()); //15 call function in result 
console.log(result()); //16
console.log(result()); //17
console.log(result()); //18