-1

我一直在使用谷歌闭包,试图让大量的 JavaScript 干净地编译,以便使用谷歌编译器最小化。我遇到了一个问题:

goog.provide('test');
goog.provide('test2');

/**
 * @constructor
 */
test = function () {
    this.x = 10;
    this.y = 13;
};

(function () {
    /**
     * @constructor
     */
    test2 = function () {
        this.x = 10;
        this.y = 13;
    };
})();

前者很好。后者产生一个常量重定义错误:

JSC_CONSTANT_REASSIGNED_VALUE_ERROR. constant test2 assigned a value more than once at /home/hbrown/tmp/closure-test/foo.js line 16 : 10
BUILD FAILED: 1 error(s), 0 warning(s)

有没有办法强制 plovr/closure 编译器允许这个构造?我环顾四周,一无所获。


后来:在更进一步的一点上,为什么闭包/plovr 认为 test2 是一个常数?我怀疑它与 plovr/closure 在调用 goog.provide 时为 test2 创建命名空间有关。很高兴看到它在生成错误时正在使用的中间形式。

4

3 回答 3

0

在函数闭包之外声明测试 2,而不分配它:

var test2;

(function() {
    test2 = function(...

我意识到这不是您想要的 Closure Compiler 配置更改,但它会提高代码可读性并解决 Closure Compiler 的反对意见。

由于它的历史,你使用 Closure Compiler 得到的一些东西实际上是 Google 内部的 Javascript 代码指南。因此,例如,您不能使用 with 语句,因为这违反了政策,即使您作为公共用户只想缩小您的代码,并且可能有一个政策允许您的公司使用 with 语句。

也就是说,我确实认为在函数闭包中声明全局并不是最佳实践(即使它是合法的 Javascript)。编写一个到处寻找/(\w[\w\d-]+) = function/并在有问题的文件顶部使用 var 声明它的脚本并不难。而且,它可能会导致所有以这种方式修改的文件更容易被给定文件的新编码人员分析。

您剩下的选择是修改开源 Closure Compiler 代码,以便它警告而不是有关此违反 Google JS 政策的错误。

于 2011-10-23T03:33:40.183 回答
0

根据您需要匿名函数的原因,您可以尝试用 goog.scope 替换匿名函数

http://closure-library.googlecode.com/svn/docs/closure_goog_base.js.html

于 2011-09-22T00:48:03.707 回答
0

尽管这只是一个猜测,但我将其作为答案输入,因为注释对于代码来说很糟糕。

你有没有尝试过这样的事情:

test2 = (function () {
    /**
     * @constructor
     */
    function inner_test2() {
        this.x = 10;
        this.y = 13;
    };

    // ...

    return inner_test2;
})();

我不建议这是一个方便的重构,特别是如果那个匿名函数又大又复杂,但是看看是什么让编译器感到困惑会很有趣(有点)。

于 2011-09-21T15:04:33.270 回答