即使在函数执行和退出之后,我仍然对存储和重用局部变量的概念着迷,而这仅仅通过代码体系结构(范围)来实现。
我正在玩这个并进行练习,其中变量(var e)应该递增并在下次重复使用。它最终会增加,但是不会保存并返回到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,但是我在这个时候避免这种情况。正如我所看到的,这段代码完全相同,但我觉得我更清楚,我可以更好地控制它。
我发现自我调用功能可能会有所帮助,但我不想在这里使用它(让我们说这不是我设计的一部分,可以立即改变计数器)。
答案 0 :(得分:2)
问题是你正在调用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
答案 1 :(得分:0)
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