Ответы:
Если вам нужно генерировать глобальные переменные в производственном коде (чего следует избегать), всегда объявляйте их явно :
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
.
РЕДАКТИРОВАТЬ Вопрос о 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);
Вот плнкр . Надеюсь, это поможет!
window
доступно только в браузерах. Не могли бы вы отредактировать свой ответ, чтобы он работал во всех средах? См. Как получить глобальный объект в JavaScript?