【问题标题】:Apps script weird behavior about loop应用程序脚本有关循环的奇怪行为
【发布时间】:2018-10-07 11:09:12
【问题描述】:

我在应用程序脚本上调试脚本时发现了一个奇怪的行为。 我不知道为什么 varconst 在应用程序脚本中的行为不同。

代码:

function myFunction() {
  Logger.log('loop with var')
  for(var i=0;i<3;i++){
    var a=i%2
    Logger.log(a)
  }
  Logger.log('loop with const')
  for(var i=0;i<3;i++){
    const b=i%2
    Logger.log(b)
  }
}

还有输出:

[18-10-07 19:03:57:377 HKT] Starting execution
[18-10-07 19:03:57:384 HKT] Logger.log([loop with var, []]) [0 seconds]
[18-10-07 19:03:57:385 HKT] Logger.log([0.0, []]) [0 seconds]
[18-10-07 19:03:57:386 HKT] Logger.log([1.0, []]) [0 seconds]
[18-10-07 19:03:57:386 HKT] Logger.log([0.0, []]) [0 seconds]
[18-10-07 19:03:57:387 HKT] Logger.log([loop with const, []]) [0 seconds]
[18-10-07 19:03:57:387 HKT] Logger.log([0.0, []]) [0 seconds]
[18-10-07 19:03:57:388 HKT] Logger.log([0.0, []]) [0 seconds]
[18-10-07 19:03:57:388 HKT] Logger.log([0.0, []]) [0 seconds]
[18-10-07 19:03:57:390 HKT] Execution succeeded [0.005 seconds total runtime]

我的预期结果是0 1 00 1 0

【问题讨论】:

  • 您的意思是0 1 00 1 0
  • 引用:“常量的值不能通过重新赋值改变,也不能重新声明”Link to Reference
  • 我猜 block-scope 在应用程序脚本中不能与 const 一起使用...因为它基于 ES3 和 ES5+ 的樱桃精选。您可以在范围之外Logger.log(b),它仍然会记录最后一个值...保持提升...可能只禁止重新声明(我猜有时是静默)。
  • 计划将 Apps Script 中的 JavaScript 实现更新到较新的版本,但没有公布具体何时实现。
  • 我只建议在 Apps 脚本的函数范围内使用 const。块范围应该是有效的,但 Apps 脚本并不完全符合 EMCAScript。

标签: javascript google-apps-script


【解决方案1】:

虽然应用程序脚本似乎在块范围内处理 const,但实际上分配给它的第一个值是坚持的那个,例如

for ( var i = 0 ; i < 5 ; i ++ ) {
  const x = i;
}

x 将始终为 0。这是由于 JavaScript 模拟器 (rhino) 中的实现错误。

这里有完整的解释 http://ramblings.mcpher.com/Home/excelquirks/gassnips/constsandscopes

这里有一个完整的总结,什么在犀牛上有效,什么无效

http://ramblings.mcpher.com/Home/excelquirks/gassnips/rhinoversion

希望应用脚本 JavaScript 方言有一天会赶上来,但同时避免使用 const,除非是一次性分配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 2019-02-11
    • 1970-01-01
    相关资源
    最近更新 更多