Ist es möglich, eine globale Variable in einer JavaScript-Funktion zu definieren?
Ich möchte die trailimage
Variable (in der makeObj
Funktion deklariert ) in anderen Funktionen verwenden.
<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
nicht deklariert eine globale Variable. Eine Folge der Zuweisung eines Werts zu einer nicht deklarierten Variablen ist die Erstellung einer Eigenschaft für das globale Objekt, die sich erheblich von der Deklaration einer Variablen unterscheidet.Antworten:
Ja, wie die anderen gesagt haben, können Sie
var
im globalen Bereich (außerhalb aller Funktionen) eine globale Variable deklarieren:Alternativ können Sie einer Eigenschaft Folgendes zuweisen
window
:... weil in Browsern
alle globalen Variablen, mit denenglobale Variablen deklariertvar
sind, Eigenschaften deswindow
Objekts sind. (In der neuesten Spezifikation, ECMAScript 2015, erstellen die Anweisungen newlet
undconst
undclass
Anweisungen im globalen Bereich Globals, die keine Eigenschaften des globalen Objekts sind. Ein neues Konzept in ES2015.)(Es gibt auch den Schrecken impliziter Globals , aber tun Sie es nicht absichtlich und tun Sie Ihr Bestes, um dies nicht versehentlich zu tun, vielleicht durch die Verwendung von ES5
"use strict"
.)Alles, was gesagt wurde: Ich würde globale Variablen vermeiden, wenn Sie dies können (und Sie können es mit ziemlicher Sicherheit). Wie ich bereits erwähnt habe, sind sie letztendlich Eigenschaften von
window
undwindow
sind bereits überfüllt genug, wenn alle Elemente mit einemid
(und vielen mit nur einemname
) darin abgelegt werden (und unabhängig von der bevorstehenden Spezifikation gibt IE so gut wie alles mit einemname
auf ).Wickeln Sie stattdessen Ihren Code in eine Gültigkeitsbereichsfunktion ein, verwenden Sie lokale Variablen für diese Gültigkeitsbereichsfunktion und schließen Sie Ihre anderen Funktionen darin:
quelle
window
in Node nicht funktioniert. Der einfachste Trick besteht darin, Folgendes festzulegen:GLOBAL.window = GLOBAL;
- wie in dieser verwandten Frage erläutert . Natürlich ist es konzeptionell nicht schön. Ich mache die Dinge lieber umgekehrt, damit ich sieGLOBAL
stattdessen verwenden kannwindow
.window.yourGlobalVariable = ...;
funktioniert wie ein Zauber, nachdem 5 bis 6 Fragen auf der Stapelseite gelesen wurden.eval
dort zu verwenden . Stattdessen:window[dynamic_variable_name] = dynamic_variable_value;
UPDATE1: Wenn Sie die Kommentare lesen, gibt es eine nette Diskussion über diese spezielle Namenskonvention.
UPDATE2: Es scheint, dass die Namenskonvention formeller geworden ist, seit meine Antwort veröffentlicht wurde. Menschen, die unterrichten, Bücher schreiben usw., sprechen über
var
Deklaration undfunction
Deklaration.UPDATE3: Hier ist der zusätzliche Wikipedia-Beitrag, der meinen Standpunkt unterstützt: http://en.wikipedia.org/wiki/Declaration_(computer_programming)#Declarations_and_Definitions
... und um die Hauptfrage zu beantworten. DECLARE-Variable vor Ihrer Funktion. Dies funktioniert und entspricht der bewährten Methode, Ihre Variablen am oberen Rand des Gültigkeitsbereichs zu deklarieren :)
quelle
definition
unddeclaration
bedeutet in C. Ihre erste Zeile könnte entweder eine Deklaration oder eine Definition sein (je nachdem, wo sie sich befindet); Der zweite ist nur eine Aufgabe. Eine Deklaration gibt nur die Interpretation des Bezeichners an (dhmyVar
ist einint
); Wenn die Erklärung auch Speicher reserviert, ist es adefinition
. Dies hat nichts mit dem Tippen zu tun. Dies ist Teil dessen, wie Kompilierungseinheiten Verweise auf andere Kompilierungseinheiten verstehen.var myVar
heißt Deklaration (es muss nicht eingegeben werden) undmyVar = 10
eine Zuweisung . Ich habe den Begriff "Definition" für die Verbindung (var myVar = 10;
) gehört.Einfach deklarieren
draußen. Dann
Hoffe das hilft.
quelle
Nein, das kannst du nicht. Deklarieren Sie einfach die Variable außerhalb der Funktion. Sie müssen es nicht gleichzeitig mit der Zuweisung des Werts deklarieren:
quelle
window
synonym. In jedem Fall ist die semantische Unterscheidung, die Sie treffen, klar, sodass es mir nichts ausmacht, nicht abzustimmen. Bearbeiten: Ich kann meine Stimme nicht ändern, sorry!var
, das ist das, was Guffa gemeint implizit erstellen (wie @DhruvPathak zeigte auch dort).Deklarieren Sie es einfach außerhalb der Funktionen und weisen Sie Werte innerhalb der Funktionen zu. Etwas wie:
Wenn Sie einfach "var" aus Ihrem Variablennamen innerhalb der Funktion entfernen, wird es auch global. Es ist jedoch besser, es einmal für einen saubereren Code außerhalb zu deklarieren. Dies wird auch funktionieren:
Ich hoffe, dieses Beispiel erklärt mehr: http://jsfiddle.net/qCrGE/
quelle
Es ist sehr einfach, die Trailimage-Variable außerhalb der Funktion zu definieren und ihren Wert in der Funktion makeObj festzulegen. Jetzt können Sie von überall auf seinen Wert zugreifen.
quelle
Mir ist klar, dass dies wahrscheinlich viele Syntaxfehler enthält, aber es ist die allgemeine Idee ... Vielen Dank, LayZee, für den Hinweis ... Sie finden unter http: //www.w3schools , was ein lokaler Speicher und ein Sitzungsspeicher sind . com / html / html5_webstorage.asp . Ich habe dasselbe für meinen Code benötigt und das war eine wirklich gute Idee.
quelle
location.reload(false);
das wiederholte Aktualisieren der Seite.Klassisches Beispiel:
Modernes, sicheres Beispiel nach Best Practice unter Verwendung eines IIFE :
Heutzutage besteht auch die Möglichkeit, die WebStorage-API zu verwenden
oder
In Bezug auf die Leistung bin ich mir nicht sicher, ob es merklich langsamer ist als das Speichern von Werten in Variablen.
Weit verbreitete Browserunterstützung wie unter Kann ich ...
quelle
localStorage.foo = JSON.stringify({ arbitrary: 'object', meaning: 42, awesome: true });
und verwendenvar foo = JSON.decode(localStorage.foo);
.localStorage
hat mit globalen Variablen zu tun?Sie möchten also, dass die Variable innerhalb der Funktion außerhalb der Funktion verfügbar ist? Warum nicht die Ergebnisse der Variablen innerhalb der Funktion zurückgeben?
var x = function returnX { var x = 0; return x; }
ist die Idee ...Ich habe dies nicht getestet, aber wenn Ihr Code vor dieser kleinen Änderung funktioniert hat, sollte er funktionieren.
quelle
Hier ist ein Beispielcode, der hilfreich sein kann.
Hier habe ich eine nette Antwort gefunden. Wie kann man eine globale Variable in JavaScript deklarieren?
quelle
Hier ist eine weitere einfache Methode, um die Variable in anderen Funktionen verfügbar zu machen, ohne globale Variablen verwenden zu müssen:
quelle
Wenn Sie eine Startfunktion erstellen, können Sie globale Funktionen und Variablen folgendermaßen definieren:
Da die Funktion mit diesem Argument global aufgerufen wird, ist dies hier der globale Bereich. Das Etwas sollte also eine globale Sache sein.
quelle
this
befindet sichundefined
außerhalb einer Funktion im strengen Modus und sollte nicht verwendet werden, um auf das globale Objekt zu verweisen.