Несмотря на то, что вы можете ссылаться на «истинную» глобальную переменную путем замены всего использования этой глобальной переменной на window["varname"]
, обычно «не рекомендуется» загрязнять глобальное пространство имен. Закрывающий компилятор разработан, чтобы отговорить вас от этого.
CAVEAT : window["varname"]
и var varname
- это не одно и то же, поскольку «окно» не всегда может быть глобальным объектом в средах без браузера. На самом деле, Closure Compiler предполагает, что глобальный объект и «окно» различны. Например, window["varname"]
будет компилироваться в window.varname
вместо var varname
. Они НЕ одинаковы, хотя в браузере они работают аналогично.
Лучше всего создать объект глобального пространства имен, а затем экспортировать только этот один объект. Все ваши «глобальные» переменные должны стать свойствами этой глобальной переменной пространства имен. Преимущества:
- Все эти глобальные переменные переименованы в более короткие версии
- Может произойти встраивание констант
- Компилятор Closure автоматически «сглаживает» пространство имен, так что ваш код не будет медленнее
- Превосходное запутывание
- Ваш код также работает в не браузерной среде. Помните, что «окно» не всегда существует (например, в коде на стороне сервера), а «глобальный объект» не всегда может быть «окном»
Если у вас есть глобальные переменные, которые пользователь должен прочитать / установить, чтобы использовать вашу библиотеку, это также не рекомендуется. Лучше предоставить API для объекта глобального пространства имен, а затем предоставить общедоступные API, как обычно, через объект окна: window["myLib"]["setConfig"] = myLib.setConfig
.
В вашем случае, если у вас есть глобальные переменные, используемые в других частях кода, не скомпилированного с помощью Closure, вы должны учитывать:
- Лучше ли поместить объявление этих переменных вне файла, скомпилированного с помощью Closure
- Почему вы не помещаете объявление этих переменных вместе с кодом, использующим их
- Должны ли вы на самом деле компилировать Closure весь код, а не только часть (это возможно? Вы используете другую библиотеку?)