为什么闭包编译不使用externs(var x = {}并且需要window.x = {})?

时间:2013-11-20 19:27:28

标签: google-closure-compiler

我准备了三个文件:

java -jar compiler.jar --js=utf8.js --js_output_file=utf8-advanced.js --charset=utf8 --compilation_level=ADVANCED_OPTIMIZATIONS --formatting=SINGLE_QUOTES --formatting=PRETTY_PRINT --externs=externs.js --use_only_custom_externs

使用Javascript:

window.erest['module'] = window.erest['module'] || {};
window.erest.module = window.erest['module'];

var module = window.erest.module;

window.erest.module.hello = function() {
    for (var i = 0; i < 5; i++) {
        window.erest.debug.hello();
    }
}

window.erest.module.max = function() {
    var list = [];
    for (var i = 0; i < list.length; i++) {
        window.erest.debug.hello();
    }
}

window.erest.module.maximum = function() {
    window.erest.debug.hello();
}

实习医生:

/**
 * @externs
 */

/**
 * @noalias
 */
var erest = {};

erest.debug = {};

/**
 * @return null
 */
erest.debug.hello = function () {};

输出:

window.a.module = window.a.module || {};
window.a.b = window.a.module;
window.a.b.hello = function() {
  for (var b = 0;5 > b;b++) {
    window.a.debug.hello();
  }
};
window.a.b.max = function() {
  for (var b = [], c = 0;c < b.length;c++) {
    window.a.debug.hello();
  }
};
window.a.b.c = function() {
  window.a.debug.hello();
};

问题 - 为什么外部人员不在这里工作:

window.a.debug.hello() should be window.erest.debug.hello()

为什么这个外部人员没有帮助:

var erest = {};

1 个答案:

答案 0 :(得分:1)

Closure-compiler将全局对象上的属性视为与全局变量不同的对象。您必须始终引用名称。

请参阅Understanding the Restrictions Imposed by the Closure Compiler

下的“将变量称为全局对象的属性”项目符号