在 GAS 中使用全局变量是否可取?有什么缺点吗?

Using Global vars in GAS, is it advisable? are there any downsides?

对不起,如果这是一个愚蠢的问题,但是这里是

所以我已经学习 Javascript 与 Google 应用程序脚本一起使用大约一年了,慢慢地但肯定会找到我的脚。

我试图在这里帮助某人处理他们的脚本,我注意到他们声明

var ss = SpreadSheetApp.getActiveSpreadsheet();

在脚本的最顶部,在所有函数之外,作为全局变量。

这让我想到,当我为电子表格编写多个 functions/scripts 时,可能值得在全局范围内声明一些 VAR,而不是在不同的函数中重复它们。

在我盲目地走这条路之前,我认为最好问问在 GAS 中使用全局变量是否存在任何重大陷阱或问题。

此外,除了在编码时节省一些输入之外,还有什么主要优势吗?

目前是否有人经常使用全局变量编写 GAS 脚本。我很想知道这一切是如何运作的?有什么缺点,任何限制或优点。

在此行下方编辑

只是想补充一点,我一直在做的 95% 的事情都局限在 Google 表格中,并带有 lil gmail 脚本。到目前为止,这就是我的范围。认为最好提一下,因为我并没有真正考虑到其他 Google 产品的脚本的含义。

有纯粹主义的观点,也有实用主义的观点。

实用上你可能面临的缺点

  • 命名可能与您附加的任何库发生冲突
  • 无法跟踪项目中多个脚本中定义的全局变量
  • 调用 API 端点的变量将始终 运行 无论您的脚本实例是否需要它们。

我确实使用全局变量,但以一种稍微保守的方式来应对这两种情况。

  • 我创建了一个唯一命名的全局对象,然后将任何全局变量作为该对象的属性挂起。本质上全局变量是命名空间的。
  • 我约束自己在每个项目中只定义一个 globals.GS 全局变量。

对于变量范围的纯粹关注在野外比 js 更重要,因为脚本在 运行 时有点沙盒化。但是,当您发布库时情况并非如此。

我没有像您给出的示例那样定义全局变量,而是将变量绑定到特定的 GAS API。这样做可能有速度优势,我不知道,但我倾向于将代码模式重用为函数之间的函数,并且不希望自己在这样做时复制作用域函数之外的任何代码。他们还会调用那些 API 端点,无论您的目标函数是否需要它们 = 速度惩罚。

全局变量对我来说只是真正的脚本项目特定变量和实用函数。通常它们可能是对脚本属性的调用。

当您使用变量定义时,例如在调用 Google 服务的示例中,您必须意识到每次您 运行 any 时都会执行此调用function 在你的项目中。

这意味着即使它在代码编写方面可能是高效的(我猜我们都是懒惰的家伙)但在执行速度方面确实不高效。

相反,假设您执行一个不需要 ss 变量的函数,SpreadSheetApp.getActiveSpreadsheet() 将被执行...

通过像这样的简单调用,这可能不是问题,但如果将这种情况乘以调用许多不同服务的大量不同变量,最终会降低执行速度。

我不是 'real' 程序员,所以我的意见仅基于个人习惯和发现,因为我在这方面从未学到任何东西 "academic"。也许其他人会有更相关的答案。

编辑:当我在打字时,乔纳森刚刚做到了!我当然同意他所说的,我会把我的 post 留在这里只是为了提高效率 ;-)