闭包编译器忽略对象突变

时间:2014-09-02 17:29:49

标签: javascript optimization google-closure-compiler

我将以下代码放入高级模式的闭包编译器中:

var obj = (function() {
  /** @constructor */
  function H(a) {
    this.a = a
  }
  var h = new H(1);
  h.b=1
  return h
})();

我得到的结果是:

(function() {
  var a = new function() {
  }(1);
  a.a = 1;
  return a;
})();

为什么忽略我对对象h.b=1所做的更改?

1 个答案:

答案 0 :(得分:1)

高级编译选项启用aggressive property removal,其中包括一些假设:

它强烈假设在"原型上定义的属性"或者"这个"将不会迭代,因此是删除的候选人。

/** @constructor */ function cls() { this.x = 1; // removal candidate due to "this" assumption; }

因此,您实际看到的this.a = a被删除了,然后将b属性重命名为a