我有一个函数可以检查对象中的回调方法是否存在。目前Closure Compiler重命名方法(onClickDisplay和onCloseHide),因此makeCallbacks()中的所有检查都会失败。
有没有办法告诉Closure Compiler不重命名方法(onClickDisplay和onCloseHide)或告诉编译器也重命名callbackNames()中的方法名称
makeCallbacks = function(tobject, methodNames) {
var callbacks = {};
methodNames.each(function(methodName) {
if (!tobject[methodName]) {
throw new Error(methodName + ' missing from ' + tobject.toString());
}
callbacks[methodName] = tobject[methodName].bind(tobject);
});
return callbacks;
};
FeedbackController = Class.create({
initialize: function(id, item) {
this.callbacks = makeCallbacks(this, this.callbackNames());
},
observeElements: function() {
$$(this.id + ' .closeme').invoke('observe', 'click', this.callbacks.onCloseHide);
},
callbackNames: function() {
return ['onClickDisplay', 'onCloseHide'];
},
onClickDisplay: function(e) {
// do something
},
onCloseHide: function(e) {
// do something
}
});
答案 0 :(得分:2)
您可以通过执行以下操作明确告诉闭包编译器不要重命名变量:
goog.exportProperty(FeedbackController, 'onClickDisplay', FeedbackController.onClickDisplay);
或者使用您的方法包含自定义外部文件:
function onClickDisplay() {};
function onCloseHide() {};
并将其提供给闭包编译器:
"--externs=/externs/externs.js"
这将阻止它重命名变量。通常,您只能使用它来与外部库进行交互。
答案 1 :(得分:1)
您正在使用的编码样式违反了使用ADVANCED_OPTIMIZATIONS的Closure编译器的一个主要要求:一致的属性访问。也就是说,您不能使用点分表示法obj.prop
和引用obj['prop']
的混合来引用同一属性。您可以引用传递给Class.create
调用的属性名称,但这将导致死代码删除和类型检查无效。如果您不想要这些行为,那么您应该真正使用SIMPLE_OPTIMIZATIONS。
您的代码也隐藏了您在FeedbackController
上定义了属性这一事实,因为Closure-compiler无法识别Class.create
正在分配属性。
除非您愿意更改编码风格,否则我建议您使用SIMPLE_OPTIMIZATIONS。
有关优化级别之间决定因素的更多信息,请参阅我的Which Compilation Level is Right for Me?帖子。