ClosureCompiler 通过高级优化删除死代码

问题描述 投票:0回答:2

以下代码:

(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()
。)

javascript google-closure-compiler dead-code
2个回答
2
投票

为此,编译器需要确定没有人用查看调用函数的函数替换“alert”:

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

但是“alert”是一个外部函数,因此无法确定它实际执行的操作。 一般来说,JavaScript 的可变性非常大,以至于可以安全地从函数中删除属性的情况非常罕见,不值得花精力去寻找它们。

一般来说,闭包编译器可以删除它作弊的属性。 这里有一些讨论:

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


0
投票

您可以通过围绕内置函数编写包装器来帮助编译器优化这些:

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()
)以进行混淆并在一定程度上缩小(未压缩时)时,这也很有用。

© www.soinside.com 2019 - 2024. All rights reserved.