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


86

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

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

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

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

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

Ответы:


96

Просто определите свои переменные в 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>

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


4
Хотя этот ответ правильный, я бы порекомендовал вам определить область видимости переменных Google Javascript, чтобы лучше понять и, возможно, избежать этого.
aleemb 03

1
Согласовано. Я всегда стараюсь объединить все функции и переменные в общее «пространство имен», чтобы избежать загромождения и конфликтов. Обычно я называю это аббревиатурой проекта или компании.
PatrikAkerstrand

Опускание этого ответа и других ему нравится, потому что он предполагает, что глобальная переменная будет создана в глобальной области, а также требует, чтобы первое упоминание переменной было в глобальной области до всех других упоминаний.
Эндрю

1
@Andrew Этот ответ был написан восемь лет назад. Во всех смыслах и целях тогда это было правильно. Если вы действительно хотите внести свой вклад, вы можете вместо этого предложить правку?
PatrikAkerstrand

@PatrikAkerstrand На самом деле свидания не имеют значения. Достаточно других ответов, использующих глобальный объект; Я объяснил, почему это не так.
Эндрю

89

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

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"

Присоединение переменных к окну должно работать во всех браузерах (и это тоже мой подход, +1!).
Денди

1
@Dan, если вы объявите "var testvar = 'hello';" вне функции он автоматически добавляется к объекту окна, и вы можете получить к нему доступ с помощью "window.testvar".
zkent

1
@zkent, это верно, но использование объекта Window все же лучше, потому что вы можете позже превратить свой код в что-то вроде кофе.
Нами Ван

Лучше использовать префикс Window вместо Document?
Эндрю

7

Ты это пробовал?

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

var HI = 'Hello World';

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

alert(HI);

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

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

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


7

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

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

2

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

var globalvar1 = 'value';

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.