Как объявить глобальную переменную в файле .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';
Вы можете получить к ним доступ позже, а также в других файлах.