Закрывающий компилятор обрабатывает определения внутри замыканий как переопределения - PullRequest
0 голосов
/ 21 сентября 2011

Я работал с Google Closure, пытаясь получить большой объем 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 разрешить эту конструкцию?Я огляделся по сторонам и ничего не нашел.


Позже: еще один вопрос: почему closure / plovr считает test2 константой?Я подозреваю, что это связано с созданием plovr / closure пространства имен для test2, когда вызывается goog.provide.было бы неплохо увидеть промежуточную форму, с которой он работает, когда генерирует ошибку.

Ответы [ 3 ]

0 голосов
/ 22 сентября 2011

В зависимости от того, зачем вам нужна анонимная функция, вы можете попробовать заменить анонимную функцию goog.scope

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

0 голосов
/ 23 октября 2011

Объявите тест 2 за пределами закрытия функции, не назначая его:

var test2;

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

Я понимаю, что это не изменение конфигурации Closure Compiler, как вы хотели, но оно улучшит читабельность кода и разрешит компилятор Closure CompilerВозражения.

Немного из того, что вы получаете с Closure Compiler, на самом деле из-за его истории, внутреннего руководства Google по Javascript-коду.Так, например, вы не можете использовать оператор with, потому что это противоречит политике, даже если вы как публичный пользователь просто хотите минимизировать свой код и можете иметь политику, которая позволяет использовать оператор with в вашей компании.

* 1007Тем не менее, я считаю, что не рекомендуется объявлять глобальное внутри закрытия функции (даже если это допустимый Javascript).И было бы не так сложно написать скрипт, который будет искать /(\w[\w\d-]+) = function/ и объявлять его с помощью var в верхней части оскорбительных файлов.И это, вероятно, приведет к тому, что все файлы, измененные таким образом, будут легче анализироваться кодерами, новыми для данного файла.

Оставшаяся опция - изменить код закрытого компилятора с открытым исходным кодом, чтобы он предупреждал вместо ошибок оэто нарушение политики Google JS.

0 голосов
/ 21 сентября 2011

Я набираю это как ответ, хотя это всего лишь предположение, потому что комментарии ужасны для кода.

Вы пробовали что-то вроде этого:

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

    // ...

    return inner_test2;
})();

Я бы не предположил, что это удобный рефакторинг, особенно если эта анонимная функция большая и сложная, но было бы интересно (вроде бы) увидеть, что именно смущает компилятор.

...