【发布时间】:2016-04-21 12:28:05
【问题描述】:
(function(){
var num = 4 // Math.random()
var module1 = {};
(function(export_to){
export_to.add1 = function(arg) { return arg+1 }
export_to.add2 = function(arg) { return arg+2 }
export_to.add10 = function(arg) { return arg+10 }
})(module1)
console.log(module1.add10(num))
})()
这是原始的内联“模块”示例。只要num 不变,GCC 就会正确内联add10 函数并用--compilation_level=ADVANCED 消除其他所有内容,只留下:
console.log(14);
结果。
将 // 更改为 && 虽然会使 GCC 的行为变得更糟。由于某种原因,它不再内联.add10,也不再注意到.add1 和.add2 根本没有被调用,实际上是死代码。
(function(){var d=Math.random(),c={};(function(b){b.b=function(a){return a+1};b.c=function(a){return a+2};b.a=function(a){return a+10}})(c);console.log(c.a(d))})();
有没有办法让 GCC 消除/内联此类函数,同时仍将它们保留在自己的 function 范围内,以防我需要一些私有持久变量并整齐地分组在原始源中的对象中?也许是一些注释?
这一切都在发布时在最新可用的预构建版本上进行了测试:
Closure Compiler (http://github.com/google/closure-compiler)
Version: v20160315
Built on: 2016/03/25 11:43
【问题讨论】:
-
你可能需要找到注解来给编译器更多的信息,但我想不出该怎么做。闭包编译器更倾向于classical Java-style inheritance patterns。这种编写模块的方式似乎是 Closure Compiler 的“新前沿”。见github.com/google/closure-compiler/wiki/JS-Modules。我希望对 Closure Compiler 中这种“模块样式”有更多经验的人可以帮助您。
-
在下面的回答中,我表明最新版本的 Closure Compiler 可以解决您的问题。我不知道他们什么时候会制作另一个预构建的编译器,但是在本地机器上构建编译器很容易。步骤是:
git clone https://github.com/google/closure-compiler.git、ant jar。 -
您还需要回答这个问题吗?
标签: javascript google-closure-compiler