Як оголосити глобальну змінну у файлі .js


86

Мені потрібно кілька глобальних змінних, які мені потрібні у всіх .jsфайлах.

Наприклад, розглянемо такі 4 файли:

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

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

Чи може хтось сказати мені, чи можливо це, чи для цього є певна робота?

Відповіді:


95

Просто визначте свої змінні в 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> -tag, якщо ви не хочете, щоб завантаження js-файлів переривало початкове завантаження сторінки.


4
Незважаючи на те, що ця відповідь правильна, я рекомендую вам скористатися обсягом змінних Google Javascript, щоб краще зрозуміти та, можливо, уникати дій саме таким чином.
aleemb

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!).
Dandy

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

1
@zkent, це правильно, але використовувати об'єкт Window все-таки краще, тому що ти, можливо, захочеш перетворити свій код на sth, як кава згодом.
Намі ВАНГ

Чи краще використовувати вікно, а не префікс документа?
Ендрю

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слід використовувати замість цього.
Томас

2

Так, ви можете отримати до них доступ. Ви повинні оголосити їх у "публічному просторі" (поза будь-якими функціями) як:

var globalvar1 = 'value';

Ви можете отримати до них доступ пізніше, також у інших файлах.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.