我的 webapp 基于一个通用脚本,我在其中定义了通用函数和一个全局变量以及处理这些函数的动态加载脚本。到目前为止,我发现导出全局变量的唯一方法是用 window["myGlobalVar"]
替换任何出现的地方,但我发现它非常难看。有更好的方法吗?
这是一个例子
// commonscript.js before compilation
function incrementVariable() {window["myGlobalVar"]++;}
window["incrementVariable"] = incrementVariable;
window["myGlobalVar"] = 0;
在另一个脚本中
alert(myGlobalVar); // <= alerts 0
incrementVariable();
alert(myGlobalVar); // <= alerts 1
我正在寻找一种在两个文件中直接使用 myGlobalVar
的方法,因为这样会更优雅。但是,我需要将 window["myGlobalVar"]
设置为指针而不是对象的副本,我不确定如何在简单类型上执行此操作。
这可能吗?将 myGlobalVar
封装在 Object
中是唯一的其他方式吗?
非常感谢你的灯。
最佳答案
新答案
Closure-compiler 支持一个@nocollapse
注释来防止一个属性被折叠成一个全局变量。这允许属性在导出时可变。
@nocollapse
不会阻止重命名 - 您仍然需要导出一个属性来完成它。
@nocollapse
当前仅在从源代码编译时受支持。它将包含在下一个版本中 - 即 v20150315 版本之后的版本。
旧答案
@expose
现已弃用。编译器将对 @expose
有一个新的但迄今为止未记录的注释:@expose。这个单一的注解既会导出一个属性,又会防止它从构造函数中折叠起来。这听起来非常适合您的情况 - 但它需要您的变量是对象的属性。
但是,请谨慎使用。任何具有 @expose 的属性都不会被重命名,也不会作为死代码被删除。这使得它对于 javascript 库编写者的使用尤其成问题。
关于Javascript Closure 编译器——导出全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10376025/