函数范围规则(Google Apps 脚本项目)

Function Scope Rules (Google Apps Script Project)

本文关键字:脚本 项目 Apps Google 范围 规则 函数      更新时间:2023-09-26

如果我在单个应用程序脚本项目中有多个文件具有同名函数,如何确定范围?

  • 按文件?
  • 通过动态范围?
  • 通过静态范围?
  • 函数创建时间(创建脚本文件)?

例如,如果我有 Stuff.gs

function start() {
  var number = getNumber();
}
function getNumber() {
  return 5;
}

More.gs

function getNumber() {
  return 10;
}

我叫start(),谷歌的平台如何决定调用哪个函数?

我做了这样的测试,但我没有得到预期的输出。输出为 10.0 。在我看来,既不应用文件范围规则,也不应用静态范围。我创建了第三个文件来进一步测试:

Test.gs

function getNumber() {
  return 15;
}

现在输出是15.0.我进一步测试并在 More.gs 中将 10 更改为 20,以查看保存时间戳是否决定了范围,但输出仍然15.0

所以对我来说,.gs 文件创建日期似乎决定了范围 - 使用包含函数名称的文件上的最新时间戳。我的假设是否正确,或者这只是一个巧合,它是以其他方式确定的?

另外,这是特定于Google的Apps Script还是一般的Javascript?

看起来这些声明都只是在全局范围内。后续定义将覆盖以前的定义,因此,如果您首先包含Stuff.gs,然后More.gs,然后Test.gs并随后调用您的函数,这将是有意义的。

JS中的范围是静态的(假设没有with和本地eval的严格模式),但全局范围可以根据加载的模块(及其顺序)动态修改。这是大多数JavaScript环境中的行为,有些还具有额外的文件(模块)范围。

使用带有闭包的 IIFE 来封装

More.gs

const More = (function() {
   function getNumber() {
      return 15;
   }
  return {
    getNumber
  };
})();

Test.gs

const Test = (function() {
   function getNumber() {
      return 15;
   }
  return {
    getNumber
  };
})();

Stuff.gs

function start() {
  var number = getNumber();
  var numberMore = More.getNumber();
  var numberTest = Test.getNumber();
}

在上面的代码中,IIFE 用于创建一个闭包,该闭包封装了 count 变量和两个内部函数:递增和递减。count 变量是私有的,只能由内部函数访问。

IIFE 立即执行,返回一个引用内部函数(递增和递减)的对象。由于闭包,这些函数可以访问私有计数变量。