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

时间:2012-04-29 21:13:53

标签: javascript google-closure-compiler

我的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唯一的其他方式吗?

非常感谢您的灯光。

2 个答案:

答案 0 :(得分:8)

新答案

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

@nocollapse不会阻止重命名 - 您仍需要导出属性才能完成此操作。

目前仅在从源代码编译时支持

@nocollapse。它将包含在下一个版本中 - 即版本 AFTER v20150315版本。

旧答案

@expose现已弃用。编译器将警告@expose

的任何用法

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

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

答案 1 :(得分:0)

如果您想拥有一个未重命名的变量,只需创建一个名为props.txt的文件,其中包含以下内容:

myGlobalVar:myGlobalVar

然后在编译代码时,添加命令行参数:--property_map_input_file props.txt

您的变量不会被重命名,只要它没有被优化,所有脚本都可以使用它。此外,如果您根本没有声明它(因此省略var myGlobalVar),则不会重命名或删除它。