8

我注意到 Google Closure Compiler 没有重命名为减少空间document之类的东西。d

我想不出这会破坏代码的情况(即document指向其他东西的地方)。其实对于window.

有理由保护document这种方式吗?

== 编辑 ==

通过重命名它,我正在考虑重新分配它。下面的例子。

var d=document;
var obj1=d.getElementById("obj1");
var obj2=d.getElementById("obj2");
... // with enough uses of document so it makes to reassign it size-wise.
4

3 回答 3

3

Closure-compiler 默认不执行这种“优化”,原因很简单,它与 gzip 一起使用时会产生更大的源代码。AliasExternals您可以通过使用 Java API 或自定义构建打开传递来启用此优化。

请参阅https://code.google.com/p/closure-compiler/source/browse/src/com/google/javascript/jscomp/AliasExternals.java#38

于 2013-08-27T13:07:00.470 回答
1

怎么了?

ProblemFactory的猜测是正确的。

这是一个//TODO在闭包编译器源代码。例如,如果我们不保存document而是window运行它们d,那么此时闭包编译器不知道它是否覆盖了另一个文件中的全局变量。就像评论说的那样,这将在未来得到解决。

话不多说,给我看看出处!

如果我们检查里面的闭包编译器源代码,VariableReferenceCheck.java我们可以发现以下内容:

 private class ReferenceCheckingBehavior implements Behavior {

    @Override
    public void afterExitScope(NodeTraversal t, ReferenceMap referenceMap) {
      // TODO(bashir) In hot-swap version this means that for global scope we
      // only go through all global variables accessed in the modified file not
      // all global variables. This should be fixed.

      // Check all vars after finishing a scope
      for (Iterator<Var> it = t.getScope().getVars(); it.hasNext();) {
        Var v = it.next();
        checkVar(v, referenceMap.getReferences(v).references);
      }
    }

如果我们检查热插拔算法本身,我们可以看到:

// Note we use the global scope to prevent wrong "undefined-var errors" on
// variables that are defined in other JS files.

因此,我们可以看到,这只是闭包编译器对跨多个文件的全局代码的理解不够好,无法进行替换。您可以随时自行更换 :)

于 2013-08-27T09:46:36.987 回答
0

我认为document是标准化的,始终是全局变量。要使用相同的方式d,它也必须是全局的,因此全局命名空间将有另一个“垃圾”变量。

对于不了解的开发人员来说,这可能是危险的(他们不会意识到这一点,因此它不是标准变量)。

于 2013-08-27T09:28:40.170 回答