Javascript Closure编译器 - 导出全局变量

Mad*_*het 3 javascript google-closure-compiler

我的webapp基于一个通用脚本,我在其中定义了常用函数和全局变量以及处理这些函数的动态加载脚本.到目前为止,我发现导出全局变量的唯一方法是替换任何出现window["myGlobalVar"]但我发现它非常难看.有更好的方法吗?

这是一个例子

// commonscript.js before compilation
function incrementVariable() {window["myGlobalVar"]++;}
window["incrementVariable"] = incrementVariable;
window["myGlobalVar"] = 0;
Run Code Online (Sandbox Code Playgroud)

在另一个脚本中

alert(myGlobalVar); // <= alerts 0
incrementVariable();
alert(myGlobalVar); // <= alerts 1
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种直接myGlobalVar在两个文件中使用的方法,因为它会更优雅.但是,我需要设置window["myGlobalVar"]指针而不是对象的副本,我不知道如何在简单类型上执行此操作.

可能吗?是否myGlobalVarObject另一种方式封装?

非常感谢您的灯光.

Cha*_*rth 8

新答案

Closure-compiler支持一个@nocollapse注释,它可以防止属性折叠为全局变量.这允许属性在导出时是可变的.

@nocollapse 不阻止重命名 - 你仍然需要导出一个属性来完成它.

@nocollapse目前仅在从源代码编译时受支持.它将包含在下一个版本中 - 即v20150315 版本之后的版本.

老答案

@expose现已弃用.编译器会警告任何用法@expose

有一个新的,但迄今为止没有记载的文本:@expose.此单个注释将导出属性并防止其从构造函数折叠.它听起来非常适合您的情况 - 但它需要您的变量作为对象的属性.

但是,要小心使用.任何具有@expose的属性都不会被重命名,也不会被删除为死代码.这使得javascript库编写者使用它尤其成问题.