Відповіді:
Якщо вам доведеться генерувати глобальні змінні у виробничому коді (яких слід уникати), завжди оголошуйте їх прямо :
window.globalVar = "This is global!";
Хоча можна визначити глобальну змінну, просто опустивши var
(припустимо, що немає локальної змінної з тим самим іменем), але це генерує неявну глобальну ситуацію , що погано робити і створювало б помилку в суворому режимі .
Якщо це єдиний додаток, де ви збираєтесь використовувати цю змінну, підхід Фелікса є відмінним. Однак, якщо ви пишете плагін 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(...) {...}
коли мені потрібно щось зберегти в глобальному масштабі, і я все-таки зберігаю його поза глобальним простором імен.
delete $.miniMenu
. Чи гаразд?
delete $.miniMenu
.
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();
});
Порада : запустіть весь цей код у консолі на цій сторінці ;-)
$current = 0;
на початку не визначитесь із функції, пізніша функція не працюватиме.
Ось основний приклад глобальної змінної, до якої можуть отримати доступ решта ваших функцій. Ось живий приклад для вас: 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 () разом з іншими функціями.
Оголосити змінну поза функціями
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
}
Найкращий спосіб - використовувати 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 . Сподіваюся, це допоможе!
window
доступний лише у браузерах. Чи можете ви відредагувати свою відповідь, щоб вона працювала у будь-яких умовах? Див. Як отримати глобальний об’єкт у JavaScript?