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

[FRAGE] Wo und wie oft die Deklaration mit var? Anfängerfrage zum Stil

Mia

New member
Hallo Ihr Lieben :)

ich habe eine Frage, die ich auch mit der Suche nicht klären konnte. In JavaScript müssen Variablen in zumindest einigen Fällen explizit deklariert werden, mit var (wenn es keine globalen Variablen sein sollen). Soweit scheint mir das klar zu sein.

Aber, meine Frage bezieht sich darauf WO die Deklaration mit var stattfinden soll?

Ein ganz konkretes Beispiel dazu:
Code:
var eingabe;
while( irgendeinebedingung ){
   eingabe = prompt("Gib Zahl ein", "von 1 bis 9");
   //hier passiert irgend etwas
}

Hier mache ich einmalig die Deklaration und arbeite dann mit der Variablen.
Oder ist es nicht schöner und kürzer so:
Code:
while( irgendeinebedingung ){
   var eingabe = prompt("Gib Zahl ein", "von 1 bis 9");
   //hier passiert irgend etwas
}

Ich mache hier zwar die explizite Deklaration mit var mehrfach, spare mir aber die extra Zeile, die irgendwo "rumhängt"?
Hat das praktische Auswirkungen? Oder ist das nur eine Frage des Geschmacks?

Gibt es da Empfehlungen?

Vielen Dank im Voraus für Eure Mühen
 
Ich mache hier zwar die explizite Deklaration mit var mehrfach
Nein, das wird auch nur einmal Deklariert, da die Deklaration vom Interpreter an den Anfang der Funktion geschoben wird. Deswegen ist das auch mehr eine stilistische Frage und wie gut der Code dann zu lesen ist. Ich persönlich würde die Variable im while-Block deklarieren, wenn die Variable auch nur dort verwendet wird. Wenn sie aber auch später noch verwendet wird, würde ich es davor machen. Macht das ganze etwas einfacher zu verstehen.

Kleines Bespiel um das zu veranschaulichen:
Code:
var b = 2;
function a(){
	console.log(b);
	var b = 3;
	console.log(b);
}
a();
Man würde vielleicht als Ausgabe 2 und 3 erwarten und nicht undefined und 3.

Ich empfehle dazu jshint - das gibt eine Warnung aus, wenn du eine Variable nicht deklarierst, doppelt deklarierst oder zuerst verwendest, bevor du sie deklarierst.
ich deklariere immer im blockanfang.
Was meinst du damit genau? Wirklich den Blockanfang oder den Funktionsanfang? Denn JS kennt keinen Blockscope, deswegen wäre am Blockanfang genauso gut, wie mitten im Code.
 
Hallo und Danke für die Antwort :)

In der Doku über strict habe ich dazu leider nicht so das richtige gefunden.
Deine Antwort war da schon viel hilfreicher. Ich vermute dann mal, dass zwischen den beiden Beispielen mit der einmaligen und sich wiederholenden Deklaration kein (nennenswerter) Unterschied besteht.
Zumindest im Internet habe ich da nichts gegenteiliges finden können.

Vielen lieben Dank!
Mia
 
Nein, das wird auch nur einmal Deklariert, da die Deklaration vom Interpreter an den Anfang der Funktion geschoben wird. Deswegen ist das auch mehr eine stilistische Frage und wie gut der Code dann zu lesen ist. Ich persönlich würde die Variable im while-Block deklarieren, wenn die Variable auch nur dort verwendet wird. Wenn sie aber auch später noch verwendet wird, würde ich es davor machen.

An den optimierenden Interpreter habe ich jetzt nun ü-ber-haupt :rolleyes: nicht gedacht!
Das macht dann natürlich Sinn so ausgereift wie die Interpreter inzwischen sind.

Vielen Dank! :)

- - - Aktualisiert - - -

Man sollte eventuell noch erklären wie sich das mit let verhält.

let scheint mir recht exotisch zu sein.
Von etwas historisch anmutenden Erinnerungen an Basic und Basic-ähnliche Sprachen einmal ganz abgesehen ;)
 
ich kenne außer js keine sprache, wo variablen funktionsscope besitzen.
blockscope ist eigentlich das was man von anderen sprachen kennt. let entspricht also dem was man aus anderen sprachen kennt. sprich let ist das bessere var.
 
Code:
function test1(){
	var a = 1;
	var b = 1;
	if (a == 1){
		var b = 2;
	}
	alert(b);
}
function test2(){
	var a = 1;
	var b = 1;
	if (a == 1){
		let b = 2;
	}
	alert(b);
}

test1();
test2();
 
korbinian falls die antwort für mich ist: unterschied zwischen let und ohne let dachte ich war mir klar. aber was ist ein funktionsskope? mir sagt nur blockscope etwas.
 
blockscope: jeder block {...} hat einen eigenen scope
funktionsscope nur funktions-blöcke function(){...} haben einen eigenen scope, blöcke innerhalb des funktionsblocks nicht
 
Mia schrieb:
let scheint mir recht exotisch zu sein.
Naja ist halt noch etwas jungfräulich. Ich habe es auch noch nicht gebraucht, möchte immer eine größt mögliche Abwärtskompatibilität gewährleisten.


Mia schrieb:
Von etwas historisch anmutenden Erinnerungen an Basic und Basic-ähnliche Sprachen einmal ganz abgesehen
Basic ist völlig an mir vorbei gegangen. Finde das immer lustig zum Grenzlandtreffen im Werdauer Wald.
Grenzlandtreffen S46/X28 in Weidmannsruh/Werdauer Wald vom 23. bis zum 26. August 2007
Alle Anwesenden dort so in den 50er Jahren Programmieren alle Basic. Alle unter 40 hantieren in C.
Dieses Jahr wird das Redpitaya in aller Munde stehen.:cool:
 
funktionsscope nur funktions-blöcke function(){...} haben einen eigenen scope, blöcke innerhalb des funktionsblocks nicht
Das heißt, eine var Variable ist ein Funktionsscope, weil sie nach unten durch vererbt wird und eine let ist ein Blockscope? Wenn ich in Perl my verwende ist das immer wie ein var in JS. Aber es heißt eigentlich Blockscope.

Dann kennst du ja den Unterschied zwischen Funktions- und Blockscope. Denn das ist der große Unterschied zwischen den beiden.
Laut Beispiel oben auf https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Statements/let ist der Unterschied, dass let Variablen nicht nach unten vererbt werden im Gegensatz zu var. Oder hab ich das falsch verstanden?
 
Code:
function xxx()
{
  // Block 1
  {
     // Block 2
    {
      // Block 3
    }
  }
}
hier hast du 3 blöcke, den funktionsblock (block 1), einen äußeren block (block 2) und einen inneren block block 3
egal wo du hier eine variable mit var deklarierst, sie ist immer in allen 3 blöcken verfügbar.
mit let deklarierte variablen sind immer nur in dem block gültig in dem sie deklariert werden, das schließt weitere innere blöcke aber mit ein.
let im block 2 ist also in block 2 und block 3 gültig, nicht aber in block 1
 
Zurück
Oben