我正在尝试让Google Closure Compiler在将对象作为设置或数据传递给函数时不要重命名它们。通过查看jQuery中存在的注释,我认为这样可以实现:
/** @param {Object.<string,*>} data */
window.hello = function(data) {
alert(data.hello);
};
hello({ hello: "World" });
然而,最终结果是这样的:
window.a = function(b) {
alert(b.a)
};
hello({a:"World"});
这里找到的ajax
函数有这个注释,而且似乎可以工作。那么为什么这样不行呢?如果数据是来自外部源或一个设置对象的返回值,我希望能够告诉编译器不要改动它,使用this["escape"]
技巧对于像这样的事情来说过于麻烦。
下面是更好的例子
function ajax(success) {
// do AJAX call
$.ajax({ success: success });
}
ajax(function(data) {
alert(data.Success);
});
输出:
$.b({c:function(a){alert(a.a)}});
success
已更名为c
,而Success
(大写S)已更名为a
。
我现在使用jQuery 1.6外部文件编译相同的代码,得到以下输出:
$.ajax({success:function(a){alert(a.a)}});
它还会产生一个警告,指出未定义属性
Success
,这是我所期望的,但它无法将Success
重命名为简单的a
,这仍然会破坏我的代码。我查看了ajax
的注释,并找到了这个类型表达式{Object.<string,*>=}
,我相应地注释了我的代码并重新编译。仍然不起作用...