ClosureCompiler消除了与先进的优化死码(ClosureCompiler removin

2019-10-18 03:28发布

下面的代码:

(function() {
 var hello = function(name) {
  alert('Hello, ' + name);
 }
 hello('New user');
})();

ADVANCED_OPTIMIZATIONS被编译为:

alert("Hello, New user");

但是,这样的代码:

(function() {
 var hello = function(name) {
  alert('Hello, ' + name);
 }
 hello.a = 5;
 hello('New user');
})();

被编译成:

function a(b){alert("Hello, "+b)}a.a=5;a("New user");

为什么它不能忽视hello.a = 5

(它不能上下文之外使用,没有eval ,没有[]和没有new Function()

Answer 1:

对于这项工作,编译器会需要确定,没有人替换为看了看调用函数的函数“警告”:

alert = function() {
  console.log(arguments.callee.caller.a);
}

但“警报”是一个外部函数,所以没有办法确定其实际作用。 一般情况下,JavaScript是这样可变的是,其属性可以从功能,可以安全删除的情况是如此罕见,这是不值得找他们的努力。

一般情况下,当关闭编译器可以将其删除是欺骗性质。 还有就是这这里一些讨论:

https://github.com/google/closure-compiler/wiki/Understanding-Property-Removal



Answer 2:

你可以帮助编译器通过写周围的内置函数的包装优化这些:

function myalert(name){alert('Hello, ' + name)}
(function() {
 var hello = function(name) {
  myalert(name);
 }
 hello.a = 5;
 hello('New user');
})();

生产:

alert("Hello, New user");

当你像包装常用的东西,这也可能是有用的document.createElement()的混淆,并在一定程度上缩小(未压缩时)。



文章来源: ClosureCompiler removing dead code with advanced optimizations