Як оголосити глобальну змінну в JavaScript?


Відповіді:


215

Якщо вам доведеться генерувати глобальні змінні у виробничому коді (яких слід уникати), завжди оголошуйте їх прямо :

window.globalVar = "This is global!";

Хоча можна визначити глобальну змінну, просто опустивши var(припустимо, що немає локальної змінної з тим самим іменем), але це генерує неявну глобальну ситуацію , що погано робити і створювало б помилку в суворому режимі .


windowдоступний лише у браузерах. Чи можете ви відредагувати свою відповідь, щоб вона працювала у будь-яких умовах? Див. Як отримати глобальний об’єкт у JavaScript?
Michał Perłakowski

52

Якщо це єдиний додаток, де ви збираєтесь використовувати цю змінну, підхід Фелікса є відмінним. Однак, якщо ви пишете плагін jQuery, розгляньте змінні та функції "простору імен" (детальніше про котирування пізніше ...), необхідних під об'єктом jQuery. Наприклад, я зараз працюю над спливаючим меню jQuery, яке я назвав miniMenu. Таким чином, я визначив "простір імен"miniMenu під jQuery і розміщую все там.

Причина, коли я використовую цитати, коли я говорю про простори імен JavaScript, полягає в тому, що вони є насправді не просторами імен у нормальному розумінні. Натомість я просто використовую об’єкт javascript і розміщую всі свої функції та змінні як властивості цього об’єкта.

Крім того, для зручності я просто підміщую простір імен плагінів на i простором імен для речей, які повинні використовуватися лише всередині плагіна, щоб приховати його від користувачів плагіна.

Ось як це працює:

// An object to define utility functions and global variables on:
$.miniMenu = new Object(); 
// An object to define internal stuff for the plugin:
$.miniMenu.i = new Object();

Тепер я можу просто робити $.miniMenu.i.globalVar = 3або $.miniMenu.i.parseSomeStuff = function(...) {...}коли мені потрібно щось зберегти в глобальному масштабі, і я все-таки зберігаю його поза глобальним простором імен.


Дякую за це, Томаш, на сайті, про який я згадував вище, підхід Фелікса працює чудово, але у мене є ще один сайт, над яким я працюю, який використовує декілька плагінів, і ваш підхід був би ідеальним, якщо я можу змусити його працювати. Будьте здорові за вашу допомогу.
Танцюрист

Це прекрасно працює! Просто переконайтесь, як говорить @Tomas: Створіть власний клас / власник для власних спеціальних функцій або змінних. +1
П'єр

Спасибі Томаш! Якщо більше не потрібно, видаліть батьківський об'єкт (наприклад:) delete $.miniMenu. Чи гаразд?
Куньж

1
@KunJ: Звичайно, як і з будь-чим: якщо ви можете гарантувати, що він більше не буде використовуватися, його можна безпечно видалити. Тим НЕ менше, JavaScript збиратиме сміття це для вас, так що ви не маєте до delete $.miniMenu.
Томаш Ашан

20

EDIT Питання про JavaScript, відповідь - про jQuery, що неправильно. Це стара відповідь, з часів, коли jQuery був широко поширений.

Натомість я рекомендую розуміти сфери застосування та закриття в JavaScript

Стара, погана відповідь: За допомогою jQuery ви можете це зробити, незалежно від того, де декларація:

$my_global_var = 'my value';

І будуть доступні скрізь. Я використовую його для створення швидких галерей зображень, коли зображення поширюються в різних місцях, наприклад:

$gallery = $('img');
$current = 0;

$gallery.each(function(i,v){
    // preload images
    (new Image()).src = v;
});
$('div').eq(0).append('<a style="display:inline-block" class="prev">prev</a> <div id="gallery"></div> <a style="display:inline-block" class="next">next</a>');
$('.next').click(function(){
    $current = ( $current == $gallery.length - 1 ) ? 0 : $current + 1;
    $('#gallery').hide().html($gallery[$current]).fadeIn();
});
$('.prev').click(function(){
    $current = ( $current == 0 ) ? $gallery.length - 1 : $current - 1;
    $('#gallery').hide().html($gallery[$current]).fadeIn();
});

Порада : запустіть весь цей код у консолі на цій сторінці ;-)


3
Не $ галерея та $ current є лише нормальними глобальними змінними? Вони працюють, тому що ви визначаєте їх як глобальні змінні, опускаючи "var", але знак долара перед ними не робить їх "змінними jQuery" ... Це буквально як виведення підкреслення або будь-який інший знак з них ... Вони будуть змінними jQuery, якщо ви використовуєте об'єкт jQuery ($) та додаєте до нього властивість: $ .myGlobalVariable = 'моє значення' ...
Андрес Елізондо

Ви, мабуть, маєте рацію, але те, що варто помітити, це те, що, використовуючи синтаксис $ myVar, ви отримуєте 2 переваги, 1) змінна є глобальною без спеціальних декларацій (крім $); і 2) ви можете легко відстежувати ваші глобальні змінні всередині коду. Відкрите для обговорення, хоча ...
aesede

Введена в оману відповідь. Погодьтеся з Андресом, що це взагалі НЕ змінна jQuery. Якщо ви $current = 0;на початку не визначитесь із функції, пізніша функція не працюватиме.
harrrrrrry

15

Ось основний приклад глобальної змінної, до якої можуть отримати доступ решта ваших функцій. Ось живий приклад для вас: http://jsfiddle.net/fxCE9/

var myVariable = 'Hello';
alert('value: ' + myVariable);
myFunction1();
alert('value: ' + myVariable);
myFunction2();
alert('value: ' + myVariable);


function myFunction1() {
    myVariable = 'Hello 1';
}

function myFunction2() {
    myVariable = 'Hello 2';
}

Якщо ви робите це в рамках функції jquery ready (), переконайтеся, що ваша змінна знаходиться у функції Ready () разом з іншими функціями.


Найкраща відповідь про те, як працюють глобальні змінні в jQuery поки.
Клінтон Грін,

1
Я знаю, що я копаю могили, але це навіть не явна глобальна змінна. Це більше співзвучне із загальнодоступною змінною, яка не охоплює надзвичайно малі сценарії. Це два абсолютно різні методи / звичаї, і цей викличе вам серйозних проблем, якщо ваш декларування явного глобального сценарію в середині декількох різних сценаріїв. Я можу лише уявити передню частину своєї команди, яка оголошує глобальну змінну у верхній частині сценарію, який є десятим, що викликається в DOM.
Брайан Елліс

4

Оголосити змінну поза функціями

function dosomething(){
  var i = 0; // can only be used inside function
}

var i = '';
function dosomething(){
  i = 0; // can be used inside and outside the function
}

3

Найкращий спосіб - використовувати closures, оскільки windowоб’єкт стає дуже, дуже захаращеним властивостями.

Html

<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript" src="init.js"></script>
    <script type="text/javascript">
      MYLIBRARY.init(["firstValue", 2, "thirdValue"]);
    </script>
    <script src="script.js"></script>
  </head>

  <body>
    <h1>Hello !</h1>
  </body>    
</html>

init.js (Виходячи з цієї відповіді )

var MYLIBRARY = MYLIBRARY || (function(){
    var _args = {}; // private

    return {
        init : function(Args) {
            _args = Args;
            // some other initialising
        },
        helloWorld : function(i) {
            return _args[i];
        }
    };
}());

script.js

// Here you can use the values defined in the html as if it were a global variable
var a = "Hello World " + MYLIBRARY.helloWorld(2);

alert(a);

Ось plnkr . Сподіваюся, це допоможе!

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