Czy można zdefiniować zmienną globalną w funkcji JavaScript?
Chcę użyć trailimage
zmiennej (zadeklarowanej w makeObj
funkcji) w innych funkcjach.
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
<script type="text/javascript">
var offsetfrommouse = [10, -20];
var displayduration = 0;
var obj_selected = 0;
function makeObj(address) {
**var trailimage = [address, 50, 50];**
document.write('<img id="trailimageid" src="' + trailimage[0] + '" border="0" style=" position: absolute; visibility:visible; left: 0px; top: 0px; width: ' + trailimage[1] + 'px; height: ' + trailimage[2] + 'px">');
obj_selected = 1;
}
function truebody() {
return (!window.opera && document.compatMode && document.compatMode != "BackCompat") ? document.documentElement : document.body;
}
function hidetrail() {
var x = document.getElementById("trailimageid").style;
x.visibility = "hidden";
document.onmousemove = "";
}
function followmouse(e) {
var xcoord = offsetfrommouse[0];
var ycoord = offsetfrommouse[1];
var x = document.getElementById("trailimageid").style;
if (typeof e != "undefined") {
xcoord += e.pageX;
ycoord += e.pageY;
}
else if (typeof window.event != "undefined") {
xcoord += truebody().scrollLeft + event.clientX;
ycoord += truebody().scrollTop + event.clientY;
}
var docwidth = 1395;
var docheight = 676;
if (xcoord + trailimage[1] + 3 > docwidth || ycoord + trailimage[2] > docheight) {
x.display = "none";
alert("inja");
}
else
x.display = "";
x.left = xcoord + "px";
x.top = ycoord + "px";
}
if (obj_selected = 1) {
alert("obj_selected = true");
document.onmousemove = followmouse;
if (displayduration > 0)
setTimeout("hidetrail()", displayduration * 1000);
}
</script>
</head>
<body>
<form id="form1" runat="server">
<img alt="" id="house" src="Pictures/sides/right.gif" style="z-index: 1; left: 372px;
top: 219px; position: absolute; height: 138px; width: 120px" onclick="javascript:makeObj('Pictures/sides/sides-not-clicked.gif');" />
</form>
</body>
</html>
var
nie deklaruje zmiennej globalnej. Konsekwencją przypisania wartości do niezadeklarowanej zmiennej jest utworzenie właściwości na obiekcie globalnym, co jest zupełnie inne niż zadeklarowanie zmiennej.Odpowiedzi:
Tak, jak powiedzieli inni, możesz użyć
var
w zakresie globalnym (poza wszystkimi funkcjami), aby zadeklarować zmienną globalną:Alternatywnie możesz przypisać do właściwości na
window
:... ponieważ w przeglądarkach
wszystkie zmienneglobalne zmienne globalne zadeklarowane za pomocąvar
są właściwościamiwindow
obiektu. (W najnowszej specyfikacji ECMAScript 2015, nowylet
,const
, orazclass
oświadczenia w zakresie globalnym tworzenia globalnych, które nie są właściwości obiektu globalnego; nową koncepcję ES2015).(Istnieje również horror niejawnych globałów , ale nie rób tego celowo i staraj się unikać robienia tego przez przypadek, być może za pomocą ES5
"use strict"
).Wszystko to powiedziało: unikałbym zmiennych globalnych, jeśli to możliwe (i prawie na pewno możesz). Jak już wspomniałem, ostatecznie są właściwościami
window
iwindow
już są mnóstwo zatłoczone tyle co ze wszystkimi elementami zid
(a wielu z nich po prostuname
) dumpingu w nim (i niezależnie, że nadchodząca specyfikacja, IE wysypisk czegokolwiek zname
tam ).Zamiast tego zawiń kod w funkcję zakresu i użyj zmiennych lokalnych dla tej funkcji zakresu, a następnie zamknij w niej pozostałe funkcje:
źródło
window
nie będzie działać w węźle. Najłatwiejszą sztuczką jest tutaj:GLOBAL.window = GLOBAL;
- jak wyjaśniono w powiązanym pytaniu . Oczywiście nie jest to całkiem koncepcyjne. Wolę robić rzeczy na odwrót, więc mogę używaćGLOBAL
zamiastwindow
.window.yourGlobalVariable = ...;
działa jak urok po przeczytaniu 5 do 6 pytań na stronie stosu.eval
. Zamiast tego:window[dynamic_variable_name] = dynamic_variable_value;
AKTUALIZACJA 1: Jeśli czytasz komentarze, jest miła dyskusja na temat tej konkretnej konwencji nazewnictwa.
UPDATE2: Wydaje się, że odkąd moja odpowiedź została opublikowana, konwencja nazewnictwa stała się bardziej formalna. Ludzie, którzy uczą, piszą książki itp. Mówią o
var
deklaracji ifunction
deklaracji.AKTUALIZACJA3: Oto dodatkowy post na Wikipedii, który popiera mój punkt: http://en.wikipedia.org/wiki/Declaration_(computer_programming ) #Declarations_and_Definitions
... i by odpowiedzieć na główne pytanie. ZADEKLARUJ zmienną przed twoją funkcją. To zadziała i będzie zgodne z dobrą praktyką deklarowania zmiennych na górze zakresu :)
źródło
definition
ideclaration
znaczy w C. Twój pierwszy wiersz może być deklaracją lub definicją (w zależności od tego, gdzie się znajduje); drugi to tylko zadanie. Deklaracja określa po prostu interpretację identyfikatora (tj.myVar
Jest anint
); jeśli deklaracja zastrzega również przechowywanie, jest todefinition
. Nie ma to związku z pisaniem; to część tego, w jaki sposób jednostki kompilacyjne rozumieją odniesienia do innych jednostek kompilacyjnych.var myVar
nazywany jest deklaracja (nie muszą być wpisane) i zadanie . Słyszałem termin „definicja” dla związku ( ).myVar = 10
var myVar = 10;
Po prostu zadeklaruj
na zewnątrz. Następnie
Mam nadzieję że to pomoże.
źródło
Nie możesz. Po prostu zadeklaruj zmienną poza funkcją. Nie musisz go deklarować w tym samym czasie, gdy przypisujesz wartość:
źródło
window
są synonimami. Tak czy inaczej, semantyczne rozróżnienie, które wprowadzasz, jest jasne, więc nie mam nic przeciwko cofnięciu głosowania. Edycja: nie mogę zmienić mojego głosu, przepraszam!var
, co jest, co rozumie się przez Guffa niejawnie utworzyć (takie jak @DhruvPathak, również tam wskazał).Po prostu zadeklaruj to poza funkcjami i przypisz wartości do funkcji. Coś jak:
Lub po prostu usunięcie „var” z nazwy zmiennej wewnątrz funkcji powoduje, że jest ona globalna, ale lepiej jest zadeklarować ją raz na zewnątrz, aby uzyskać czystszy kod. Będzie to również działać:
Mam nadzieję, że ten przykład wyjaśnia więcej: http://jsfiddle.net/qCrGE/
źródło
Bardzo łatwo zdefiniować zmienną trailimage poza funkcją i ustawić jej wartość w funkcji makeObj. Teraz możesz uzyskać dostęp do jego wartości z dowolnego miejsca.
źródło
Zdaję sobie sprawę, że jest w tym prawdopodobnie wiele błędów składniowych, ale jest to ogólny pomysł ... Bardzo dziękuję LayZee za zwrócenie na to uwagi ... Możesz dowiedzieć się, czym jest pamięć lokalna i sesyjna na http: //www.w3schools. com / html / html5_webstorage.asp . Potrzebowałem tego samego do mojego kodu i to był naprawdę dobry pomysł.
źródło
location.reload(false);
odświeżania strony wielokrotnie.Klasyczny przykład:
Nowoczesny, bezpieczny przykład oparty na najlepszych praktykach przy użyciu IIFE :
Obecnie istnieje również możliwość korzystania z interfejsu API WebStorage
lub
Pod względem wydajności nie jestem pewien, czy jest zauważalnie wolniejszy niż przechowywanie wartości w zmiennych.
Rozpowszechniona obsługa przeglądarek, jak podano w artykule Czy mogę używać ...
źródło
localStorage.foo = JSON.stringify({ arbitrary: 'object', meaning: 42, awesome: true });
ivar foo = JSON.decode(localStorage.foo);
.localStorage
ma wspólnego ze zmiennymi globalnymi?Czy chcesz, aby zmienna wewnątrz funkcji była dostępna poza funkcją? Dlaczego nie zwrócić wyników zmiennej wewnątrz funkcji?
var x = function returnX { var x = 0; return x; }
jest pomysł ...Nie przetestowałem tego, ale jeśli Twój kod działał przed tą niewielką zmianą, powinien on działać.
źródło
Oto przykładowy kod, który może być pomocny.
Tutaj znalazłem fajną odpowiedź How-can-one-deklarate-a-global-variable-in-JavaScript
źródło
Oto kolejna łatwa metoda udostępnienia zmiennej w innych funkcjach bez konieczności używania zmiennych globalnych:
źródło
jeśli tworzysz funkcję startową, możesz zdefiniować funkcje globalne i zmienne w następujący sposób:
Ponieważ funkcja jest wywoływana globalnie z tym argumentem, tutaj jest to zasięg globalny. Więc coś powinno być globalne.
źródło
this
znajduje sięundefined
w trybie ścisłym poza funkcją i nie należy go używać do odwoływania się do obiektu globalnego.