Мне нужно несколько глобальных переменных, которые нужны мне во всех .js
файлах.
Например, рассмотрим следующие 4 файла:
global.js
js1.js
js2.js
js3.js
Есть ли способ, которым я могу объявить 3 глобальные переменные global.js
и получить к ним доступ в любом из других 3 .js
файлов, учитывая, что я загружаю все вышеуказанные 4 файла в документ HTML?
Может ли кто-нибудь сказать мне, возможно ли это или есть способ добиться этого?
Рекомендуемый подход:
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"
источник
Ты это пробовал?
Если вы это сделаете:
var HI = 'Hello World';
В
global.js
. А затем сделайте:В
js1.js
нем это предупредит нормально. Вам просто нужно включитьglobal.js
его в HTML-документ.Единственная загвоздка в том, что вы должны объявить его в области видимости окна (а не внутри каких-либо функций).
Вы можете просто исключить
var
деталь и создать ее таким образом, но это не очень хорошая практика.источник
Как упоминалось выше, возникают проблемы с использованием самой верхней области в вашем файле сценария. Вот еще одна проблема: файл сценария может запускаться из контекста, который не является глобальным контекстом в некоторой среде выполнения.
Было предложено назначить глобальное значение
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 или другие инструменты, чтобы получить более надежное и менее хакерское обнаружение среды выполнения.
источник
GLOBAL
теперь устарела иglobal
должна использоваться вместо нее.Да, вы можете получить к ним доступ. Вы должны объявить их в «публичном пространстве» (вне каких-либо функций) как:
var globalvar1 = 'value';
Вы можете получить к ним доступ позже, также в других файлах.
источник