Есть ли способ `goog.provide` что-то без использования глобального объекта?

Использование глобального объекта для этого было проблематичным для меня. Вот простой пример, иллюстрирующий мою проблему:

In a.js:

goog.provide('app.a');

goog.require('app.b');

app.a = function () {
    return [
        app.b('Hey, there!'),
        app.c('yo')
    ];
};

Обратите внимание, что в приведенном выше файле я использую app.c без явного требования.

In b.js:

goog.provide('app.b');

goog.require('app.c');

app.b = function (msg) {
    return app.c('b ' + msg);
};

In c.js:

goog.provide('app.c');

app.c = function (msg) {
    return { msg: msg };
};

Я могу запустить это через closurebuilder, и он будет работать нормально. Он также будет работать без ошибок в браузере. Но мне не нравится, как app.c можно использовать без явного требования.

Лучшее решение, которое я могу придумать, это если бы каждый файл каким-то образом мог использовать свою собственную копию глобальной переменной app, созданной из вызовов goog.require. Это приведет к ошибкам во время выполнения, когда вы попытаетесь использовать что-то, что не было required. Не уверен, что это возможно.

Есть ли способ сделать то, что я описал, или есть какая-то альтернатива?


person benekastah    schedule 23.01.2014    source источник


Ответы (1)


Нет причин не помещать требование для app.c в app.a, и это лучшая практика, но да, она не поймает его, если вы этого не сделаете, из-за того, как компилятор собирает требования. Это вызовет ошибку, если вы удалите требование app.b, а это всего лишь одна из многих, многих, многих особенностей закрытой земли.

person thisispete    schedule 23.01.2014