递增并存储一个“;私人的“;使用闭包的变量
Incrementing and storing a "private" variable using closures
我对存储和重用局部变量的概念很着迷,即使在函数执行和退出之后也是如此,而这仅仅是通过代码体系结构(作用域)实现的。
我正在处理这个问题,并进行了一个练习,其中一个变量(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
每次调用这种构造时,究竟发生了什么,我们能按部就班地遵循流程吗?
以下是我的一些想法&假设,如果这些是错误的,请告诉我:
我通过一个变量引用了这个函数,以排除这个变量被篡改的可能性。我被垃圾收集器吓坏了,我想这就是他们睡前告诉顽皮程序员的。
然而,如果我只是简单地运行,行为似乎不会改变console.log(sumFunc(2,3));
我最终故意返回subFunction,就像我在研究的开始一样,并希望尽可能地保持简单。我意识到我可能会返回一个匿名函数(return function()),然后返回d,但此时我避免了这种情况。在我看来,这个代码做了完全相同的事情,但我觉得它对我来说更清楚,我对它有更好的控制
我发现自调用函数可能会有所帮助,但我不想在这里使用它(假设这不是我设计的立即更改计数器的一部分)。
问题是您正在调用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
相关文章:
- 子类访问父类's闭包变量
- 构造函数函数闭包变量
- 如何冻结函数's在闭包中的变量
- 使变量可用于不带闭包的异步调用
- 局部变量在闭包中丢失
- 其中是闭包中存储的变量-堆栈或堆
- javascript闭包:保护内部变量
- Javascript:附加字符串中的事件,闭包中的变量求值
- "可变变量可从闭包“”访问;在传递给Array.prototype.every的函数中
- JavaScript闭包和变量引用
- 如果全局上下文中的变量是属性,那么为了闭包的目的,如何区分它们
- 如何访问闭包中的变量
- 闭包中的本地变量从外部更改.这是一个javascript错误,或者我做错了什么
- 使用JavaScript回调函数了解变量作用域和闭包
- 递增并存储一个“;私人的“;使用闭包的变量
- 循环和局部变量内部的闭包
- 未使用JS闭包将变量传递给onClick函数
- 函数变量闭包
- 陷入javascript变量闭包
- 用具体的例子理解Javascript中的私有变量(闭包?)