1

当我使用“this”时,google 闭包编译器(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;
...
4

1 回答 1

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在非构造函数、非原型函数中使用关键字。您应该始终使用完整的命名空间。然后编译器可以展平命名空间方法(这就是发生限制的原因)。

查看哪个编译级别适合我?

于 2013-10-21T17:00:04.057 回答