我有一个外部 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/