Google 应用程序脚本 - 迭代期间变量重置

Google apps script - variable reset during iteration

我希望全局变量 iii 递增,但 iii 始终保持 = 1,直到达到最大堆栈大小。

var iii = 1; //this is supposed to be global variable declaration in google apps script

function tryglobal() {
  for (iii = 1; iii < 100; iii++)  {
    console.log(iii);
    iii = iii*2;
    tryglobal();
  }
}

但 iii 在 google 应用程序脚本中始终保持 1 直到堆栈溢出。

为什么会这样?是因为每次迭代都是分开处理的吗?

每次您从脚本编辑器、UI 或触发器执行函数时,都会加载整个项目,这意味着 iii 设置为 1

另一方面,您的函数在 for 循环的每次迭代中调用自身,这会设置 iii=1,因此它进入某种“无限循环”并且永远不会到达第一次迭代的结尾(意味着它永远不会执行 i++);

因为 console.logiii=iii*2; 之前,您的日志永远不会显示 1 以外的内容。

建议 1

  1. 每次修改iii后添加console.log。
  2. 正如 TheMaster 的回答中提到的,您可以省略循环的第一个参数,以避免 iii 被“重置”
  3. 您应该避免编写进入“无限循环”的代码。为此,您应该包含一个退出条件
var iii=1; //this is supposed to be global variable declaration in google apps script
console.log(iii);

function tryglobal() 
{
for (;iii<100;iii++) 
  {console.log(iii);
  iii=iii*2;
  console.log(iii);
  /** The following line is only "required" if you include the first argument and you are 
   not sure how your for statement will work */
  if(iii < 5) return; 
  }
}

问题:

for-loop 初始化表达式在每次递归时将 iii 重置为 1

/*<ignore>*/console.config({maximize:false,timeStamps:false,autoScroll:false});/*</ignore>*/
var iii=1; //this is supposed to be global variable declaration in google apps script

function tryglobal() 
{
for (iii=1;iii<100;iii++) 
  {console.log(iii);
  iii=iii*2;
  tryglobal();
  }
}
tryglobal()
<!-- https://meta.whosebug.com/a/375985/ -->    <script src="https://gh-canon.github.io/stack-snippet-console/console.min.js"></script>

解决方案:

避免在 for() 循环初始化程序中将 iii 重置为 1

/*<ignore>*/console.config({maximize:false,timeStamps:false,autoScroll:false});/*</ignore>*/
var iii=1; //this is supposed to be global variable declaration in google apps script

function tryglobal() 
{
for (;iii<100;iii++) 
  {console.log(iii);
  iii=iii*2;
  tryglobal();
  }
}
tryglobal()
<!-- https://meta.whosebug.com/a/375985/ -->    <script src="https://gh-canon.github.io/stack-snippet-console/console.min.js"></script>

参考文献: