673 Stimmen

Definieren Sie eine globale Variable in einer JavaScript-Funktion

Ist es möglich, eine globale Variable in einer JavaScript-Funktion zu definieren?

Ich möchte die trailimage Variable (deklariert in der makeObj Funktion) in anderen Funktionen.

<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>

28 Stimmen

Um ein Global zu deklarieren, verwenden Sie einfach nicht das Schlüsselwort "var".

26 Stimmen

@Ibrahim: "Um ein Global zu deklarieren, darf man einfach nicht das Schlüsselwort "var" verwenden". Igitt! Das Grauen ! ;-) Zum Glück gibt es im Strict-Modus keine impliziten Globals mehr.

36 Stimmen

@Ibrahim Diallo - nicht verwendet var nicht deklarieren eine globale Variable. Die Zuweisung eines Wertes an eine nicht deklarierte Variable hat zur Folge, dass eine Eigenschaft des globalen Objekts erstellt wird, was sich von der Deklaration einer Variablen unterscheidet.

929voto

T.J. Crowder Punkte 948310

Wie die anderen bereits gesagt haben, können Sie var im globalen Bereich (außerhalb aller Funktionen und Module), um eine globale Variable zu deklarieren:

<script>
var yourGlobalVariable;
function foo() {
    // ...
}
</script>

(Beachten Sie, dass dies nur bei weltweit Umfang. Wenn dieser Code in einem Modul wäre - <script type="module">...</script>  - wäre es nicht im globalen Bereich, so dass kein Global erzeugt würde).

Alternativ dazu:

In modernen Umgebungen können Sie eine Eigenschaft des Objekts zuweisen, die globalThis bezieht sich auf ( globalThis wurde in ES2020 hinzugefügt):

<script>
function foo() {
    globalThis.yourGlobalVariable = ...;
}
</script>

In Browsern können Sie das Gleiche mit der globalen Option window :

<script>
function foo() {
    window.yourGlobalVariable = ...;
}
</script>

...weil in Browsern, alle globalen Variablen globale Variablen, die mit var sind Eigenschaften der window Objekt. (In der neuesten Spezifikation, ECMAScript 2015, ist das neue let , const y class Anweisungen im globalen Bereich erzeugen Globals, die keine Eigenschaften des globalen Objekts sind; ein neues Konzept in ES2015).

(Außerdem gibt es der Schrecken der impliziten Globals aber tun Sie es nicht absichtlich und tun Sie Ihr Bestes, um es nicht versehentlich zu tun, vielleicht indem Sie die ES5-Funktion "use strict" .)

All das ist gesagt: Ich würde globale Variablen vermeiden, wenn es möglich ist (und das ist fast sicher der Fall). Wie ich bereits erwähnt habe, sind sie am Ende Eigenschaften von window y window ist bereits reichlich gedrängt was bei allen Elementen mit einem id (und viele mit nur einem name ), die darin abgelegt werden (und unabhängig von der kommenden Spezifikation legt der IE so ziemlich alles ab, was eine name dort).

In modernen Umgebungen sollten Sie stattdessen Module verwenden:

<script type="module">
let yourVariable = 42;
// ...
</script>

Der Code der obersten Ebene in einem Modul befindet sich im Modulbereich, nicht im globalen Bereich, so dass eine Variable erstellt wird, die der gesamte Code in diesem Modul sehen kann, die aber nicht global ist.

In veralteten Umgebungen ohne Modulunterstützung verpacken Sie Ihren Code in eine Scoping-Funktion und verwenden Variablen, die für diese Scoping-Funktion lokal sind, und machen Ihre anderen Funktionen zu Closures innerhalb dieser Funktion:

<script>
(function() { // Begin scoping function
    var yourGlobalVariable; // Global to your code, invisible outside the scoping function
    function foo() {
        // ...
    }
})();         // End scoping function
</script>

11 Stimmen

Beachten Sie, dass die Verwendung von window wird in Node nicht funktionieren. Der einfachste Trick ist hier zu setzen: GLOBAL.window = GLOBAL; -- wie erklärt in dieser verwandten Frage . Natürlich ist es konzeptionell nicht schön. Ich ziehe es vor, die Dinge andersherum zu machen, so kann ich die GLOBAL anstelle von window .

4 Stimmen

@CasparKleijne, ich verstehe das nicht. Warum sollten Sie es einem Fenster zuweisen, wenn Sie buchstäblich keinen Beweis dafür haben, dass das Fensterobjekt tatsächlich existiert. Sie wissen nicht, wie Ihr Code in der Zukunft verwendet werden wird. Er könnte sogar in der MongoDB-Umgebung oder in rino anstelle Ihres Knotens verwendet werden. Außerdem ist das Window-Objekt nicht einmal im Browser sichtbar, wenn Sie zum Beispiel Web Worker verwenden. Das macht die Wiederverwendbarkeit komplett zunichte.

6 Stimmen

window.yourGlobalVariable = ...; funktioniert nach dem Lesen von 5 bis 6 Fragen auf der Stack-Site wie am Schnürchen.

33voto

harihb Punkte 550

Erklären Sie einfach

var trialImage;

draußen. Dann

function makeObj(address) {
    trialImage = [address, 50, 50];
    ...
    ...
}

23voto

op1ekun Punkte 1898

Wenn Sie die Kommentare lesen, gibt es eine schöne Diskussion über diese spezielle Namenskonvention.

Es scheint, dass seit der Veröffentlichung meiner Antwort die Benennungskonvention formeller geworden ist. Menschen, die lehren, Bücher schreiben usw., sprechen über var Erklärung, und function Erklärung.

Hier ist der zusätzliche Wikipedia-Beitrag, der meinen Standpunkt unterstützt: [Erklärungen und Definitionen](https://en.wikipedia.org/wiki/Declaration(computer_programming)#Declarations_anddefinitions) ...und um die Hauptfrage zu beantworten. Deklarieren Sie eine Variable vor Ihrer Funktion. Das funktioniert und entspricht der guten Praxis, die Variablen am Anfang des Bereichs zu deklarieren :)

7 Stimmen

Wenn Sie Ihre Variablen an anderer Stelle definieren wollen, sollten Sie wissen, was Heben bedeutet. Hier ist ein sehr schöner Artikel darüber adequatelygood.com/2010/2/JavaScript-Scoping-und-Hoisting . Viel Glück!

1 Stimmen

Das ist nicht das, was definition y declaration Ihre erste Zeile könnte entweder eine Deklaration oder eine Definition sein (je nachdem, wo sie steht); die zweite ist einfach eine Zuweisung. Eine Deklaration gibt nur die Interpretation des Bezeichners an (d.h.. myVar es un int ); wenn die Erklärung également Reserven zu speichern, ist es ein definition . Dies hat nichts mit der Typisierung zu tun, sondern ist Teil der Art und Weise, wie Kompiliereinheiten Verweise auf andere Kompiliereinheiten verstehen.

4 Stimmen

Auch in JS, var myVar heißt Erklärung (es muss nicht eingegeben werden) und myVar = 10 eine Auftrag . Ich habe den Begriff "Defintion" für die Verbindung gehört ( var myVar = 10; ).

19voto

DhruvPathak Punkte 40485

Deklarieren Sie sie einfach außerhalb der Funktionen, und weisen Sie Werte innerhalb der Funktionen zu. Etwa so:

<script type="text/javascript">
    var offsetfrommouse = [10, -20];
    var displayduration = 0;
    var obj_selected = 0;
    var trailimage = null ;  // Global variable
    function makeObj(address) {
        trailimage = [address, 50, 50];  // Assign value

Oder entfernen Sie einfach "var" aus dem Variablennamen innerhalb der Funktion, um sie global zu machen, aber es ist besser, sie einmal außerhalb zu deklarieren, um den Code sauberer zu machen. Dies wird auch funktionieren:

var offsetfrommouse = [10, -20];
var displayduration = 0;
var obj_selected = 0;

function makeObj(address) {
    trailimage = [address, 50, 50];  // Global variable, assign value

Ich hoffe, dieses Beispiel erklärt mehr: http://jsfiddle.net/qCrGE/

var globalOne = 3;
testOne();

function testOne()
{
    globalOne += 2;
    alert("globalOne is :" + globalOne );
    globalOne += 1;
}

alert("outside globalOne is: " + globalOne);

testTwo();

function testTwo()
{
    globalTwo = 20;
    alert("globalTwo is " + globalTwo);
    globalTwo += 5;
}

alert("outside globalTwo is:" + globalTwo);

0 Stimmen

Ziemlich saubere und funktionierende Lösung +1

13voto

Guffa Punkte 663241

Nein, das können Sie nicht. Deklarieren Sie die Variable einfach außerhalb der Funktion. Sie müssen sie nicht gleichzeitig mit der Zuweisung des Wertes deklarieren:

var trailimage;

function makeObj(address) {
  trailimage = [address, 50, 50];

1 Stimmen

Entschuldigung! "Ist es möglich, eine globale Variable in einer JavaScript-Funktion zu definieren?" -- "Nein, kann man nicht" ist nicht korrekt, wie die erste Antwort zeigt!

6 Stimmen

@mustafa.0x: Sie irren sich. Sie können nicht definieren. eine globale Variable innerhalb einer Funktion. Sie können stillschweigend erstellen eine globale Variable, oder erstellen Sie eine Fenstereigenschaft innerhalb einer Funktion, aber Sie können keine globale Variable innerhalb einer Funktion definieren.

1 Stimmen

In Bezug auf JavaScript in einer Browserumgebung sind eine globale Variable und eine Eigenschaft von window sind synonym. Wie auch immer, die semantische Unterscheidung, die Sie machen, ist klar, so dass es mir nichts ausmacht, die Abstimmung rückgängig zu machen. Edit: Ich kann meine Stimme nicht ändern, sorry!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X