javascript - 将库转换为 JavaScript 闭包

标签 javascript google-apps-script closures

我有一个外部 JavaScript 函数库,我需要将其引入我的服务器端 Google Apps 脚本项目。我这样做主要是出于性能原因,但也因为 Google now recommends against using external libs .

在当前配置中,外部库中的函数由<Libname>.funcName() 引用,并且同样包含库中的任何全局变量,例如<Libname>.globA .如果我只是将库复制到我的项目中的一个文件中,这些函数(和“全局函数”)将被引用为 funcName()独自的。我的项目中有数百个可能需要更改的此类引用。没关系;这是全局搜索和替换可以解决的问题。但是,我担心“命名空间”问题......由于库是第三方代码,我无法控制它,现在我遇到了名称冲突,因为库中的对象和函数有与我的一些代码同名。

我怎样才能将这段代码以一种将其内部细节与我的代码分开的方式拉入我的项目中?有没有办法做到这一点并保留当前的命名约定,<Libname>.funcName() ?我相信 JavaScript 闭包是正确的解决方案,但对它们的了解还不够。

我的项目,Code.gs

var globA = { key: 'aKey', value: 'valA' };

function myFunction() {
  var a = MyLib.getValue();
  Logger.log( JSON.stringify( a ) );  // { key: 'libKey', value: 'valLibA' };
}

function getValue() {
  return globA;
}

图书馆“MyLib”,Code.gs

var globA = { key: 'libKey', value: 'valLibA' };

function getValue(  ) {
  return globA;  
}

最佳答案

有两种方法可以解决这个问题。

你可以使用 browserify将节点库转换为一段代码,可以简单地粘贴到应用程序脚本编辑器中。

或者您自己使用 immediately invoked function expression 包装代码.

像这样:

var MyLib = (function() {
  var globA = { key: 'libKey', value: 'valLibA' };
  function getValue(  ) {
    return globA;  
  }

  return {
    globA: globA,
    getValue: getValue
  }
})();

顺便说一句。如果您创建多个 .gs 文件,其中的代码/定义将按照文件名在编辑器左侧显示的顺序执行。

关于javascript - 将库转换为 JavaScript 闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34459670/

相关文章:

rust - 返回对具有泛型 Fn 特征/值的泛型类型的引用

javascript - 如何始终将某个路径参数替换为 Node.js 中的另一个值?

javascript - 尽管对象在数组中,indexOf 仍返回 -1 - Google 电子表格脚本中的 Javascript

javascript - 将已添加到 Google 云端硬盘的图片链接插入到 Google 表格中

javascript - 在以下示例中,JavaScript 闭包是如何工作的?

javascript - 在angularjs中的$scope成员函数内引用函数内的变量

Javascript 变量函数不保留值

javascript - 如何隐藏 URL 中的文件夹/路径并仅保留域

javascript - 在 Angular 7 中实现 redux 会出现错误 TS2307 : Cannot find module 'redux' . 错误

javascript - 当我尝试访问新的工作表 ID () 时,Google 应用脚本在不同文件夹中复制脚本时出现类型错误