根据文档(https://developers.google.com/closure/compiler/docs/api-tutorial3#externs),似乎闭包编译器应该在没有外部声明时重命名变量,包括从外部代码位使用函数/变量时。他们给出的例子是
function makeNoteDom(noteTitle, noteContent, noteContainer) {
// Create DOM structure to represent the note.
var headerElement = textDiv(noteTitle);
var contentElement = textDiv(noteContent);
...
}
其中textDiv函数由某种第三方库在全局范围内声明。它说textDiv应该被声明为外部以防止重命名。
我的问题是 - 当我将此代码或类似代码放入Closure Compiler而没有任何外部声明时,为什么textDiv没有重命名(这会破坏代码),正如文档所示?
答案 0 :(得分:2)
编译器假定对未定义函数的调用实际上是对外部函数的调用。使用命令行编译器,您可以使用--warning_level VERBOSE
让编译器将此条件视为错误。
Web Application主要是为演示而构建的,默认情况下假设这一点。虽然您可以设置VERBOSE
警告级别,但不会更改此功能。有关选项的信息,请参阅Additional Web Service Options页面。我已就此提出bug report。
由于属性的重命名算法,如果未在外部对象中声明相同的属性名称,则将以破解方式重命名未声明的属性。