Google Apps Script全局变量iii迭代未递增致栈溢出问题咨询
问题原因分析
你的问题核心在于递归调用时,for循环的初始化语句会反复重置全局变量iii的值,导致它永远无法真正递增。我们一步步拆解执行流程就能明白:
- 初始状态:全局变量
iii = 1,第一次调用tryglobal()。 - 进入函数后,for循环的第一个环节是初始化:
iii = 1——不管此时iii原本是多少,这行代码都会把它强制重置为1。 - 接着判断
iii < 100(1<100成立),进入循环体:- 打印
iii,输出1; - 执行
iii = iii*2,此时全局iii变成2; - 递归调用
tryglobal(),进入新的函数执行上下文。
- 打印
- 在新的
tryglobal()调用里,for循环的初始化语句再次执行:iii = 1,把刚变成2的全局变量又改回了1。 - 重复上述步骤:每次递归都会把
iii重置为1,打印1,乘2变2,再递归重置...永远达不到iii >=100的终止条件,最终因为递归层数过多触发栈溢出。
这和“迭代被单独处理”无关,本质是你在递归函数的for循环里,用全局变量作为循环变量,同时又在循环初始化时强制给它赋值1,导致每次递归都会覆盖之前的修改。
修正方案
要解决这个问题,你需要避免递归时重置全局变量,有两种常见思路:
思路1:使用局部循环变量
把循环变量改成函数内的局部变量,避免全局变量被反复修改:
function tryglobal() { // 用let声明局部变量,仅在当前函数调用内有效 for (let iii = 1; iii < 100; iii++) { console.log(iii); iii = iii * 2; tryglobal(); } }
思路2:将变量作为参数传递
把当前的循环值作为参数传入递归函数,完全避开全局变量的干扰:
function tryglobal(current) { for (let i = current; i < 100; i++) { console.log(i); const next = i * 2; tryglobal(next); } } // 初始调用传入起始值 tryglobal(1);
内容的提问来源于stack exchange,提问作者jmd
相关产品推荐
相关产品推荐

