当我使用'this'时,谷歌闭包编译器(http://closure-compiler.appspot.com/home)似乎保留了所有方法名称。或使用揭示模块模式时。当它们不在可能被其他外部方法引用的对象中时,它似乎只将方法重命名为字母。我已经尝试包装我的(实用程序)对象和使用它的匿名方法,但这似乎没有帮助。如何创建可能彼此共享的对象(和单独的脚本文件),并且仍然将它缩写为所有方法名称?
我在SO上阅读了几篇帖子,并没有看到任何解决这个问题的帖子,只发布了由于与外部变量冲突而未重命名的内容。
var Utility = (function () {
this.isDefined = function (v) {
/// <summary>Checks to see if a variable is defined.</summary>
return typeof v !== 'undefined';
}
this.isObj = function (v) {
/// <summary>Checks to see if a variable is an object.</summary>
return typeof v === 'object';
}
...
})();
然后我希望能够做到:
(function(u) {
u.isDefined();
})(Utility);
我也试过了:
var Utility = (function () {
var utility = {};
utility.isDefined = function (v) {
/// <summary>Checks to see if a variable is defined.</summary>
return typeof v !== 'undefined';
}
utility.isObj = function (v) {
/// <summary>Checks to see if a variable is an object.</summary>
return typeof v === 'object';
}
return utility;
...
答案 0 :(得分:2)
揭示对象模式不适用于闭包编译器。您使用的额外闭包也不会使窗口别名并记录全局变量。 Closure-compiler也是最终用例本身存在问题。目前,编译器不能很好地处理别名,特别是在将名称空间作为函数参数传递时。
// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// ==/ClosureCompiler==
var Utility = {};
Utility.isDefined = function (v) {
/// <summary>Checks to see if a variable is defined.</summary>
return typeof v !== 'undefined';
};
Utility.isObj = function (v) {
/// <summary>Checks to see if a variable is an object.</summary>
return typeof v === 'object';
};
(function() {
function myPrivateFunction(x) {
}
Utility.SomeMethod = function(x) {
return myPrivateFunction(x);
};
})();
Utility.isDefined(x);
window['Utility'] = Utility;
可以在http://closure-compiler.appspot.com/
测试此示例的编译和重命名您可以使用output_wrapper
标记并正确导出符号来保护您的局部变量不会流入全局范围。
编译器还特别禁止在非构造函数,非原型函数中使用this
关键字。您应该始终使用完整的命名空间。然后,编译器可以展平命名空间方法(这就是限制发生的原因)。