【发布时间】:2011-10-19 15:29:40
【问题描述】:
我试图让 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"});
找到here 的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 externs file 编译相同的代码并得到以下输出:
$.ajax({success:function(a){alert(a.a)}});
它还会产生一个警告,指出属性Success 未定义,正如我所料,但它不能将Success 重命名为简单的a,这仍然会破坏我的代码。我查看了为ajax 提供的注释,我找到了这个类型表达式{Object.<string,*>=},我相应地注释了我的代码,然后重新编译。还是不行……
【问题讨论】:
-
为了让以后阅读本文的人更好地理解:链接的 JS 是一个外部文件。它仅与要编译的代码一起使用,以防止重命名“外部化”变量、属性和函数/方法。其中的注释仅表明编译时类型检查的正确用途。他们绝不会指示编译器不要重命名 jQuery 的方法和参数。
标签: javascript google-closure-compiler