Как объявить глобальную переменную в файле .js - PullRequest
82 голосов
/ 03 июня 2009

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

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

  1. global.js
  2. js1.js
  3. js2.js
  4. js3.js

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

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

Ответы [ 5 ]

90 голосов
/ 03 июня 2009

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

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

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

Чтобы убедиться, что это работает, вы должны включить / link в 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>

Конечно, вы можете связать теги сценария непосредственно перед закрывающим тегом , если вы не хотите, чтобы загрузка js-файлов прерывала начальную загрузку страницы.

85 голосов
/ 03 июня 2009

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

window.greeting = "Hello World!"

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

function foo() {

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

}

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

  1. Цель является явной. Использование ключевого слова var может легко привести к объявлению глобального vars, который должен был быть локальным или наоборот. Этот вид области видимости переменных является источником путаницы для многих разработчиков Javascript. Таким образом, как общее правило, я должен убедиться, что все объявления переменных начинаются с ключевого слова var или префикса window.

  2. Вы также стандартизируете этот синтаксис для чтения переменных таким образом, что означает, что локально 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"
7 голосов
/ 03 июня 2009

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

Если вы делаете:

var HI = 'Hello World';

В global.js. А затем сделайте:

alert(HI);

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

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

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

5 голосов
/ 06 апреля 2014

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

Было предложено назначить глобальное значение для 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 .

Полагаю, можно также использовать Webpack или другие инструменты для более надежного и менее хакерского обнаружения среды выполнения.

2 голосов
/ 03 июня 2009

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

var globalvar1 = 'value';

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...