Hallo Camping_RIDER
Wenn wir vom allgemeinen Anfänger sprechen, dann kann ich von gar keinem Vorwissen ausgehen - außer den Grundlagen, die direkt für das Verständnis des Artikels notwendig sind. Da wir über einen Anwendungs- und Praxis-Artikel sprechen, kann ich (auch ohne weitere Erläuterungen) davon ausgehen, dass der Anfänger die Grundlagen von JavaScript, also insbesondere auch, wie var
in JavaScript funktioniert, verstanden hat.
Ich glaube es gibt da durchaus Abstufungen, was das Verständnis von var
angeht. ;-)
Du schreibst, dass ein Missverständnis auftreten könnte bezüglich des Geltungsbereichs von Variablen. Damit sind wir schon weg vom allgemeinen Anfänger (denn der hätte entweder überhaupt keine Vorstellung von Geltungsbereichen und damit kein Problem oder aber Geltungsbereiche in JavaScript schon verstanden und ergo auch kein Problem)
Wie gesagt, ich denke, nur weil jemand eine grobe Vorstellung von lokalem und globalem Geltungsbereich hat, heißt das nicht zwangsläufig, dass er tatsächlich verstanden hat, dass es wirklich nur global object und function scope gibt, und dass der Anweisungsblock eines conditional statements zum Beispiel keinen Geltungsbereich definiert.
Jedenfalls, du wirst lachen, erinnere ich mich noch gut, dass es bei mir selbst, als jemand der tatsächlich mit JavaScript angefangen hat zu Programmieren, durchaus eine Phase gab, in der ich zwar verstanden hatte, dass eine ohne das Schlüsselwort var
deklarierte Variable global sichtbar wird, so dass man von überall auf sie zugreifen kann, ich aber dennoch zum Beispiel solchen Code geschrieben habe…
function z (x, y) {
for (var i = 0; i < x; i++) {
}
for (var i = 0; i < y; i++) {
}
}
…weil ich aufgrund des Beispielcodes den man so sieht instinktiv davon ausgegangen bin, dass die Variable i
in diesem Fall nur für die Schleife gilt und ich zunächst, da es ja funktioniert hat, auch gar nicht versucht hatte herauszufinden ob das überhaupt stimmt. :-D
Und auch wenn ich jetzt kein passendes Beispiel zum Verlinken zur Hand habe, meine ich dennoch sagen zu können, dass mir bei der Ansicht von so manchem von Fragestellern hier im Forum geposteten Code aufgefallen wäre, dass ich nicht der einzige bin, der diese Erfahrung gemacht hat.
function () {
var i, foo;
if (condition) {
foo = bar;
for (i = 0; i < baz; i++) {
}
}
}
Wenn ich aber sowas gelesen hätte, wäre mir dieses Missverständnis wahrscheinlich erspart geblieben, denn auch wenn dieses konkrete Beispiel isoliert betrachtet vielleicht nicht genügt hätte um meine Aufmerksamkeit zu wecken, hätte ich mich bei wiederholter Konfrontation mit dieser Art der Notation doch sicherlich gefragt, warum diese Deklarationen ohne Wertzuweisung am Anfang der Funktion vorgenommen werden und ich wäre so vermutlich schon früher auf des Rätsels Lösung gestoßen.
Aber du hast schon recht, dass jemand mit einem anderen Hintergrund im Gegenteil gerade dadurch auf die falsche Fährte geführt werden könnte. Allerdings betrifft dies dann wohl eher Leute, die aufgrund ihrer allgemeinen Erfahrung mit „RTFM“ wohl tatsächlich am besten bedient wären.
[…] ist aber vom reinen JavaScript-Standpunkt aus mMn nicht begründbar.
Jein. Ich sehe was du meinst und stimme dir in diesem Punkt grundsätzlich auch zu. :-)
Nichtsdestotrotz denke ich, dass es sehr viele Anfänger und sogar Fortgeschrittene gibt, die, wenn sie zum Beispiel mit dem folgenden Code konfrontiert würden und sagen sollten welcher Wert in die Konsole geschrieben wird, nicht die richtige Antwort geben würden!
var foo = 10;
function bar (baz) {
console.log(foo);
if (baz) {
var foo = 20;
}
}
bar(true);
Der Anfänger würde hier wahrscheinlich 10
sagen. Der Fortgeschrittene 20
. :-D
Um an dieser Stelle mal ein Zitat einzuwerfen: „Programs that appear to do one thing but actually do another are much harder to get right.“ [Douglas Crockford]
Es geht hier also nicht nur um die Frage der Zugehörigkeit zu einem Geltungsbereich, sondern auch um die Art und Weise, wie Deklarationen von lokalen Variablen in JavaScript intern gehandhabt werden. Und ja, ich spreche hier trotz deiner Einwände weiterhin von Deklarationen. ;-)
Was ich damit sagen will ist, dass die Deklaration einer Variablen innerhalb einer Kontrollstruktur einerseits dazu führen kann, dass fälschlicherweise ein Geltungsbereich angenommen wird wo keiner ist, andererseits dadurch aber auch der Umstand verschleiert wird, dass die tatsächliche Deklaration, nämlich die Zuweisung der lokalen Variablen zum activation object des function context, bei der sie per default mit undefined
initialisiert wird, bereits vor der Ausführung irgendwelcher Anweisungen des Funktionkörpers der aufgerufenen Funktion erfolgt und sie – wenn es soweit ist – dementsprechend bereits Teil der scope chain ist, sie also innerhalb der Funktion bereits existiert, obwohl die entsprechende Bekanntmachung im Code erst später vorgenommen wird.
Insofern repräsentiert eine Notation, bei der die lokalen Variablen am Anfang einer Funktion "deklariert" werden, wesentlich besser die tatsächlichen Begebenheiten, als wenn dies immer erst dort passiert, wo die Variable gerade gebraucht wird, würde ich meinen.
Insbesondere sollte JavaScript mit den einzigartigen Möglichkeiten und Konzepten von JavaScript im Hinterkopf programmiert werden - und nicht mit den Konzepten von Java/C/... im Hinterkopf ;) So hat halt jede Sprache ihre Besonderheiten - und das zu kenntlich zu machen sollte mit ein pädagogisches Ziel sein, nicht es zu verschleiern ;)
Tja, und das ist nun die große Frage. ;-)
Wie ich in meiner ersten Antwort abschließend betonte, betrachte ich dies als „Ansichtssache“ und kann gut damit leben, wenn du meine Ansicht in diesem Punkt nicht teilst.
Es ist wohl immer eine Abwägung, bei der man sich gut überlegen sollte an wen ein entsprechendes Beispiel im Einzelfall adressiert ist. Bei Anfängern, auch dann, wenn sie keine blutigen Anfänger mehr sind, würde ich zu meinem Ansatz tendieren, aber je fortgeschrittener das Publikum ist für welches die Botschaft gedacht ist, desto mehr Gewicht gewinnt hier deine Argumentation in meinen Augen. ;-)
Viele Grüße,
Orlok
--
„Das Wesentliche einer Kerze ist nicht das Wachs, das seine Spuren hinterlässt, sondern das Licht.“
Antoine de Saint-Exupéry