• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[FRAGE] Unterschied zwischen Globale und Lokale Variablen

pumuckl

New member
Hallo,
ich möchte mich etwas mit javascript beschäftigen. Dabei verstehe ich etwas nicht. Es geht um Globale und Lokale Varriablen. In mein Beispiel: variable a ist Global deklaliert und auch definiert. Doch wenn ich in Funktion drauf zugreifen möchte, erhalte ich die Meldung undefined.
Woran liegt das? ich dachte wenn die Variable Global definiert sind, kann ich überall drauf zugreifen.



HTML:
<form >
<label for="Feld1">Feld1: <input id="feld1" type="number" min="100" max="220" step="1" 

value="2210"> </label>
 <button type="button" id="berechnen" onclick="test ();">berechnen</button>
</form>

Code:
var a = document.getElementById("feld1").value;

function test () {

alert (a);
}

Liebe Grüße
 
Bin jetzt auch nicht der JS Experte aber ich denke, das Global und Local falsch interpretiert wird.

Global bezieht sich nur auf die Variable selbst. Das füllen funktioniert aber nur in der eigentlichen Funktion, wenn dort diese auch abgefragt wird.

PHP:
var a;

function test () {
   a = document.getElementById("feld1").value;
   alert (a);
}

Danach könnte man die Variable auch weitergeben ...
PHP:
var a;

function test () {
   a = document.getElementById("feld1").value;
   test_2();
}

function test_2(){
   alert(a);
}

Dieses würde nicht funktionieren, wenn a Local definiert ist.
PHP:
function test () {
   var a = document.getElementById("feld1").value;
   test_2();
}

function test_2(){
   alert(a); // Ungetestet - sollte aber undefiniert rauskommen.
}

Bitte korrigiert mich, wenn ich damit falsch liege.

Gruß,
Terra
 
hi, wie tsseh schon sagt kommt es drauf an wo im Dokument getElementById aufgerufen wird.

Wen du das Javascript aufruft bevor der Parser das Formular erricht hast ist getElementById undefiend. Logisch er kann es zu diesen Zeitpunk noch nicht kennen.

Rufst Du den Skriptblock nach den Formular auf geht es.
Code:
<!DOCTYPE html>

<head>
    <title>Bla Blub</title>
</head>

<body>
    <form>
        <label for="Feld1">Feld1:
            <input id="feld1" type="number" min="100" max="220" step="1" value="2210"> </label>
        <button type="button" id="berechnen" onclick="test ();">berechnen</button>
    </form>
    <script>
        var a = document.getElementById("feld1").value;

        function test() {
            alert(a);
        }
    </script>
</body>

</html>
auch das geht:
Code:
<!DOCTYPE html>

<head>
    <title>Bla Blub</title>
</head>

<body>
    <script>
        function test() {
            alert(a);
        }
    </script>
    <form>
        <label for="Feld1">Feld1:
            <input id="feld1" type="number" min="100" max="220" step="1" value="2210"> </label>
        <button type="button" id="berechnen" onclick="test ();">berechnen</button>
    </form>
    <script>
        var a = document.getElementById("feld1").value;
    </script>
</body>

</html>

terra75 schrieb:
Dieses würde nicht funktionieren, wenn a Local definiert ist.
PHP:
function test () {
   var a = document.getElementById("feld1").value;
   test_2();
}


function test_2(){
   alert(a); // Ungetestet - sollte aber undefiniert rauskommen.
}
Bitte korrigiert mich, wenn ich damit falsch liege.
thats right. Wann man allerdings das Schlüsselwort var weglässt hat man automatisch wider eine Globale Variable.
Javascript Globale und lokale Variablen | mediaevent.de
 
Stimmt schon. Ich kenne selbst das Problem mit der Einbindung des Scripts im Header. Aber ich bin auch kein Freund davon Scripte irgendwo am Ende des Quelltextes einzubinden. Einfach der Übersicht halber.

Bleibt dann halt nur die Möglichkeit abzuwarten, bis das DOM komplett geladen ist. Da bietet JS aber auch genügend Möglichkeiten.
PHP:
document.addEventListener("DOMContentLoaded", function() {

oder einfacher:
PHP:
window.onload

Globale Variablen sollte man ja sowieso nicht nutzen, wie ich es öfters schon gelesen habe. Da ist ja die Fehlertoleranz zu hoch. Ganz Hilfreich ist ja auch am Anfang des Scriptes "use strict"; einzubinden.

Gruß,
Terra
 
Zuletzt bearbeitet:
Ungetestet - sollte aber undefiniert rauskommen.
Nein - da kommt ein ReferenceError.

Da ist ja die Fehlertoleranz zu hoch.
Wenn dann ist die Toleranz zu klein ;)
Die Fehleranfälligkeit ist zu hoch...

PS: Wenn die Zuweisung zu früh ausgeführt wird, sollte aber eine Meldung in der Fehlerkonsole stehen.
PPS: Und ich bin mir ziemlich sicher, dass pumuckl .value eigentlich gar nicht zwischenspeichern will, denn dadurch wird immer der Wert, der beim Laden der Seite in dem <input> stand, ausgegeben und nicht der aktuelle Wert im <input>. Wenn dann speichert man die Node selber.
 
Äh... nein. Warum? Wenn ich irgendeine Software oder Hardware habe, möchte ist, dass sie so lange wie möglich hält und möglichst wenig abstürzt. Dafür brauche ich eine hohe Fehlertoleranz.
 
Äh... nein. Warum?
weil du so fehler verdeckst, diese dadurch später(zu spät) und schwerer findest.
weil du so in inkonsistente zustände kommen kannst, undefiniertes verhalten verursachen kannst.
fehler sollten dem user sichtbar gemacht werden(so dass der diese an den support melden kann) und dann sollte in einen definierten zustand übergegangen werden, zur not mit absturz und automatischem fehlerbericht an den support.

Wenn ich irgendeine Software oder Hardware habe, möchte ist, dass sie so lange wie möglich hält und möglichst wenig abstürzt.
ja, der anwender will aber auch nicht, dass sein projekt, in dem viele mannjahre stecken, durch inkonsistenzen zerstörrt wird. er möchte nicht, dass seine maschine durchdreht, weil sie in einem nicht getesteten zustand ist.

Dafür brauche ich eine hohe Fehlertoleranz.
nein, dafür braucht man softwaretests, automatische und manuelle und eine hohe testabdeckung. und man muss die fehler erkennen.
 
fehler sollten dem user sichtbar gemacht werden(so dass der diese an den support melden kann) und dann sollte in einen definierten zustand übergegangen werden, zur not mit absturz und automatischem fehlerbericht an den support.
Genau sowas (bis auf den Absturz) würde ich als Fehlertoleranz bezeichnen.

... ich glaube, wir haben unterschiedliche Vorstellungen vom Begriff "Fehlertoleranz". Ich hoffe wir können uns wenigstens darauf einigen, dass globale Variablen vermieden werden sollten...
 
Ah... OK. Jetzt weiß ich, was du meinst. Stimmt - invalides HTML kann leicht die Fehlersuche erschweren.

Wobei ich hier einen Mittelweg bevorzugen würde: ein Parser, der bei einem Fehler nicht selbstständig abbricht, sondern einen z.B. per Event benachrichtigt und man dann selber entscheiden kann, wie man auf den Fehler reagiert. (Ich hatte z.B. in einem Thunderbird Addon das Problem, dass eine Einstellungsseite wegen einem XML-Fehler nicht angezeigt wurde. Der Grund war, dass eine DTD nicht geladen werden konnte, weil ich offline war - und die Einstellung wollte ich ändern, weil der Offlinebetrieb gestört war. Sowas ist aus Nutzersicht inakzeptabel.)

Dadurch könnte man dann z.B. zwischen Entwicklungsstadium (jeder Fehler wird aufgezeigt) und Produtivphase (nur kritische Fehler werden beachtet) umschalten.
 
Zurück
Oben