-1

私は、Google コンパイラーを使用して最小化のためにきれいにコンパイルする JavaScript の大部分を取得しようとして、Google クロージャーを使用してきました。私は問題に遭遇しました:

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 を定数とみなすのですか? goog.provide が呼び出されたときに、plovr/closure が test2 の名前空間を作成したことに関係していると思われます。エラーが生成されたときに処理している中間フォームを確認するとよいでしょう。

4

3 に答える 3

0

匿名関数が必要な理由によっては、無名関数をgoog.scopeに置き換えてみてください。

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

于 2011-09-22T00:48:03.707 に答える
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

コメントはコードにとってひどいので、これは単なる推測ですが、答えとして入力しています。

次のようなことを試しましたか:

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

    // ...

    return inner_test2;
})();

特にその無名関数が大きくて複雑な場合、それが便利なリファクタリングであるとはお勧めしませんが、コンパイラを混乱させているのは何かを見るのは興味深いことです。

于 2011-09-21T15:04:33.270 に答える