Как объявить глобальную переменную в файле .js

Мне нужно несколько глобальных переменных, которые мне нужны во всех файлах .js.

Например, рассмотрим следующие 4 файла:

  • global.js
  • js1.js
  • js2.js
  • js3.js

Есть ли способ, чтобы я мог объявить 3 глобальных переменных в global.js и получить к ним доступ в любом из других 3 .js файлов, учитывая, что я загружаю все эти 4 файла в документ HTML?

Может кто-нибудь, пожалуйста, скажите мне, возможно ли это или есть ли работа для достижения этого?

Ответ 1

Просто определите свои переменные в global.js вне области видимости функции:

// global.js
var global1 = "I'm a global!";
var global2 = "So am I!";

// other js-file
function testGlobal () {
    alert(global1);
}

Чтобы убедиться, что это работает, вы должны включить /link to global.js, прежде чем пытаться получить доступ к любым переменным, определенным в этом файле:

<html>
    <head>
        <!-- Include global.js first -->
        <script src="/YOUR_PATH/global.js" type="text/javascript"></script>
        <!-- Now we can reference variables, objects, functions etc. 
             defined in global.js -->
        <script src="/YOUR_PATH/otherJsFile.js" type="text/javascript"></script>
    </head>
    [...]
</html>

Конечно, вы могли бы связать теги script непосредственно перед закрытием <body> -tag, если вы не хотите, чтобы загрузка js файлов прерывала загрузку начальной страницы.

Ответ 2

Рекомендуемый подход:

window.greeting = "Hello World!"

Затем вы можете получить к нему доступ в любой функции:

function foo() {

   alert(greeting); // Hello World!
   alert(window["greeting"]); // Hello World!
   alert(window.greeting); // Hello World! (recommended)

}

Этот подход является предпочтительным по двум причинам.

  • Явное намерение. Использование ключевого слова var может легко привести к объявлению глобального vars, который должен был быть локальным или наоборот. Подобная переменная область видимости - это путаница для многих разработчиков Javascript. Итак, как правило, я уверен, что всем объявлениям переменных предшествует ключевое слово var или префикс window.

  • Вы также стандартизируете этот синтаксис для чтения переменных таким образом, что означает, что локальная область var не сжимает глобальный var или наоборот. Например, что здесь происходит, неоднозначно:

 

 greeting = "Aloha";

 function foo() {
     greeting = "Hello"; // overrides global!
 }

 function bar(greeting) {
   alert(greeting);
 }

 foo();
 bar("Howdy"); // does it alert "Hello" or "Howdy" ?

Тем не менее, это намного чище и менее подвержено ошибкам (вам действительно не нужно помнить все правила изменения переменных):

 function foo() {
     window.greeting = "Hello";
 }

 function bar(greeting) {
   alert(greeting);
 }

 foo();
 bar("Howdy"); // alerts "Howdy"

Ответ 3

Вы пробовали?

Если вы выполните:

var HI = 'Hello World';

В global.js. А затем выполните:

alert(HI);

В js1.js он будет предупреждать об этом. Вам просто нужно включить global.js до остальных в документе HTML.

Единственное, что вы должны объявить в области окна (не внутри каких-либо функций).

Вы можете просто удалить часть var и создать их таким образом, но это не очень хорошая практика.

Ответ 4

Как упоминалось выше, есть проблемы с использованием самой верхней области видимости в вашем файле script. Вот еще одна проблема: файл script может запускаться из контекста, который не является глобальным контекстом в какой-либо среде выполнения.

Было предложено напрямую назначить глобальное значение window. Но это также зависит от времени выполнения и не работает в Node и т.д. Это показывает, что переносное управление глобальной переменной требует особого внимания и дополнительных усилий. Возможно, они исправит его в будущих версиях ECMS!

В настоящее время я рекомендую что-то подобное для поддержки надлежащего глобального управления для всех сред выполнения:

/**
 * Exports the given object into the global context.
 */
var exportGlobal = function(name, object) {
    if (typeof(GLOBAL) !== "undefined")  {
        // Node.js
        GLOBAL[name] = object;
    }
    else if (typeof(window) !== "undefined") {
        // JS with GUI (usually browser)
        window[name] = object;
    }
    else {
        throw new Error("Unkown run-time environment. Currently only browsers and Node.js are supported.");
    }
};


// export exportGlobal itself
exportGlobal("exportGlobal", exportGlobal);

// create a new global namespace
exportGlobal("someothernamespace", {});

Это немного больше печатает, но делает ваше управление глобальной переменной надежным.

Отказ от ответственности: часть этой идеи пришла ко мне при просмотре предыдущих версий stacktrace.js. Я считаю, что также можно использовать Bower или другие инструменты, чтобы получить более надежное и менее хакерское обнаружение среды выполнения.

Ответ 5

Да, вы можете получить к ним доступ. Вы должны объявить их в "публичном пространстве" (вне любых функций) следующим образом:

var globalvar1 = 'value';

Вы можете получить к ним доступ позже, а также в других файлах.