Odpowiedzi:
Jeśli musisz generować zmienne globalne w kodzie produkcyjnym (czego należy unikać), zawsze deklaruj je jawnie :
window.globalVar = "This is global!";
Chociaż można zdefiniować zmienną globalną, po prostu ją pomijając var
(zakładając, że nie ma zmiennej lokalnej o tej samej nazwie), generuje to niejawną zmienną globalną, co jest złe i spowodowałoby błąd w trybie ścisłym .
Jeśli jest to jedyna aplikacja, w której zamierzasz używać tej zmiennej, podejście Felixa jest doskonałe. Jeśli jednak piszesz wtyczkę jQuery, weź pod uwagę "przestrzeń nazw" (szczegóły o cudzysłowach później ...) zmienne i funkcje potrzebne w obiekcie jQuery. Na przykład obecnie pracuję nad wyskakującym menu jQuery, które nazwałem miniMenu. Dlatego zdefiniowałem „przestrzeń nazw” miniMenu
w jQuery i umieszczam tam wszystko.
Powodem, dla którego używam cudzysłowów, kiedy mówię o przestrzeniach nazw javascript, jest to, że tak naprawdę nie są one przestrzeniami nazw w normalnym sensie. Zamiast tego po prostu używam obiektu javascript i umieszczam wszystkie moje funkcje i zmienne jako właściwości tego obiektu.
Ponadto, dla wygody, zwykle dzielę przestrzeń nazw wtyczki na przestrzeń i
nazw dla rzeczy, które powinny być używane tylko wewnątrz wtyczki, aby ukryć ją przed użytkownikami wtyczki.
Tak to działa:
// 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();
Teraz mogę po prostu zrobić $.miniMenu.i.globalVar = 3
lub $.miniMenu.i.parseSomeStuff = function(...) {...}
kiedykolwiek muszę coś zapisać globalnie i nadal trzymam to z dala od globalnej przestrzeni nazw.
delete $.miniMenu
.:). Czy to jest w porządku?
delete $.miniMenu
.
EDYCJA Pytanie dotyczy JavaScript, odpowiedź dotyczy jQuery, co jest błędne. To stara odpowiedź, z czasów, gdy jQuery był szeroko rozpowszechniony.
Zamiast tego zalecam zrozumienie zakresów i zamknięć w JavaScript
Stara, zła odpowiedź: z jQuery możesz to zrobić, bez względu na to, gdzie jest deklaracja:
$my_global_var = 'my value';
I będzie dostępny wszędzie. Używam go do robienia szybkich galerii zdjęć, gdy obrazy są rozmieszczone w różnych miejscach, takich jak:
$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();
});
Wskazówka : uruchom cały kod w konsoli na tej stronie ;-)
$current = 0;
na początku funkcji, późniejsza nie zadziała.
Oto podstawowy przykład zmiennej globalnej, do której mają dostęp pozostałe funkcje. Oto przykład dla Ciebie na żywo: 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';
}
Jeśli robisz to w ramach funkcji ready () jquery, upewnij się, że zmienna znajduje się wewnątrz funkcji ready () razem z innymi funkcjami.
Zadeklaruj zmienną poza funkcjami
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
}
Najlepszym sposobem jest użycie closures
, ponieważ window
obiekt jest bardzo, bardzo zaśmiecony właściwościami.
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 (na podstawie tej odpowiedzi )
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);
Oto plnkr . Mam nadzieję, że to pomoże!
window
jest dostępna tylko w przeglądarkach. Czy możesz edytować swoją odpowiedź, aby działała we wszystkich środowiskach? Zobacz Jak uzyskać obiekt globalny w JavaScript?