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

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

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

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

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

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

5 ответов


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

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

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

чтобы убедиться, что это работает, вы должны включить/ссылку на 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-файлов прерывала начальную загрузку страницы.


рекомендуется:

window.greeting = "Hello World!"

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

function foo() {

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

}

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

  1. намерение явным. Использование var ключевое слово может легко привести к объявлению global 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"

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

если вы:

var HI = 'Hello World';

на global.js. А потом сделай:

alert(HI);

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

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

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


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

было предложено назначить глобальное значение window напрямую. Но это тоже выполнить-зависит от времени и не работает в узле etc. Это показывает, что портативное глобальное управление переменными нуждается в тщательном рассмотрении и дополнительных усилиях. Возможно, они исправят это в будущих версиях 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 или другие инструменты, чтобы получить более надежный и менее hackish обнаружение среды выполнения.


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

var globalvar1 = 'value';

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