Sven Rautenberg: Das Problem sitzt tiefer... ;)

Beitrag lesen

Moin!

Ich weiss ja nicht, welchen Browser Du verwendest, um das zu testen, aber das widerspricht nicht nur jeglicher Logik, sondern auch dem praktischen Verhalten meines Mozilla 1.2.1. ;-)

var n1 = "hans mustermann"; n1 = n1.split(' '); alert(typeof(n1)); alert(n1.length); alert(n1);

Du hast recht! Ich konnte mein berichtetes Verhalten tatsächlich mit deiner Zeile nicht nachvollziehen. Weder im Mozilla noch im (vorher von mir verwendeten) Opera.

Zu allem Überfluss klappte es dann mit meinen Variablennamen ebenfalls nicht mehr!

Aber mit der Variable "name" klappt es! Hehe!

Man sollte allerdings keine *globale* Variable 'name' verwenden, da damit die Eigenschaft window.name ueberschrieben wird. (Der globale Namensraum und die window-Eigenschaften sind in den Browsern sinnbefreiterweise ueberlagert. Man hielt das wohl mal fuer "einfacher".)

Und genau _das_ ist das Problem hier. "window.name" und "name" sind in diesem Anwendungsfall identisch. Und da window.name eine Eigenschaft von window ist, welche als String festgelegt ist, muss Javascript Zuweisungen auf diese Eigenschaft in einen String wandeln.

Wie gesagt: name ist _keine_ Variable, wenn man sowas macht:

name="hans mustermann"; name=name.split(" ");
(der Typ von name bleibt String)

name wird zur Variablen, wenn man sowas macht:
var name="hans mustermann"; name=name.split(" ");
(name wird zum Array)

Mit anders benannten Variablen geht es natürlich immer:
n1="hans mustermann"; n1=n1.split(" ");
(n1 wird zum Array)

Interessanterweise (naja, eigentlich nicht) kann man auch im dritten Beispiel mittels window.n1 auf die Variable n1 zugreifen - was durchaus Sinn macht, weil man nur so fenster- und framesübergreifend auf Variablen und Funktionen zugreifen kann (vgl. http://aktuell.de.selfhtml.org/tippstricks/javascript/fensterzugriff/index.htm ganz unten letztes "Beachten Sie" - dumm von mir, ich hab das selbst geschrieben... ;) ).

Was sollte man also beachten?

Man sollte im Hinterkopf behalten, dass alle Variablen, die man verwendet, nicht nur als "variable", sondern auch als "window.variable" angesprochen werden können. Und da das window-Objekt schon ein paar Eigenschaften mitbringt, gibt es naturgemäß immer schon ein paar Variablen, die man vielleicht besser nicht überschreiben sollte - siehe http://selfhtml.teamone.de/javascript/objekte/window.htm. Dazu gehören als potentiell beliebte Variablennamen unter anderem "name" und "status". Also Vorsicht! Man entgeht _diesem_ Problem, indem man seine Variablen _immer_ mit "var variable" deklariert. Dann wird ein eventuell vorhandenes Objekt überschrieben, man hat eine echte Variable. Allerdings hat man dann das andere Problem, dass man nicht mehr auf das überschriebene Objekt zugreifen kann. Wer also unbedingt eine Variable "status" benötigt und diese mit "var status='ein Text'" deklariert, kann danach nicht mehr auf window.status zugreifen, um die Statuszeile zu ändern. Finde ich ziemlich praktisch. :)

- Sven Rautenberg

--
"Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)