我试图让Google Closure编译器在作为设置或数据传递给函数时不重命名对象。通过查看目前在jQuery的注释,我想这会工作:防止Google Closure编译器重命名设置对象
/** @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
功能发现here有这个注解,它似乎工作。那么,为什么不呢?如果数据是来自外部源或设置对象的返回值,我希望能够告诉编译器不要触摸它,但使用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 externs file相同的代码,并得到下面的输出:
$.ajax({success:function(a){alert(a.a)}});
它也产生了财产Success
没有定义一个警告,因为我所期望的,但不能重命名Success
到只需a
,这仍然会破坏我的代码。我查看ajax
的注释,我发现这种类型的表达{Object.<string,*>=}
,我相应地注释了我的代码,然后重新编译。仍然没有工作...
为了更好地理解以后任何人的阅读:链接的JS是一个externs文件。它仅与代码编译一起使用,以防止重命名“外部化”变量,属性和函数/方法。其中的注释只是表示编译时类型检查的正确使用。他们绝不会指示编译器不重命名jQuery的方法和参数。 – Kiruse