【问题标题】:ClosureCompiler removing dead code with advanced optimizationsClosureCompiler 通过高级优化删除死代码
【发布时间】:2025-11-30 00:55:01
【问题描述】:

以下代码:

(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 compiler-construction google-closure-compiler dead-code


    【解决方案1】:

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

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

    但是“alert”是一个外部函数,所以没有办法确定它的实际作用。一般来说,javascript 是如此的可变,以至于可以安全地从函数中删除属性的情况非常罕见,不值得花精力去寻找它们。

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

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

    【讨论】:

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

      【讨论】: