if(!requestAnimationFrame) {
»Prüft, ob eine globale oder lokale Variable nach Boolean umgewandelt true ergibt. Wenn weder eine lokale noch eine globale Variable dieses Namens existiert, bricht das Script hier mit einem Ausnahmefehler (einer sogenannten Exception) ab: ReferenceError: objekt not defined.«
http://aktuell.de.selfhtml.org/artikel/javascript/objektabfragen/#obj
requestAnimationFrame =
mozRequestAnimationFrame || webkitRequestAnimationFrame ||
oRequestAnimationFrame || msRequestAnimationFrame ||
function(callback, element){setTimeout(callback, 1000 / 60);};
Dasselbe hier. Wenn der Bezeichner mozRequestFrame und keine solche Variable im Funktions- bzw. globalen Scope gefunden wird, dann gibt es einen ReferenceError (vgl. ES5 10.2.1, GetBindingValue).
Gerade weil es vielleicht nicht definiert ist, will ich das ja erst mal mit
if
abfragen und die Zuweisung ggf vornehmen.
Dann verwende window.requestAnimationFrame, typeof requestAnimationFrame != 'undefined' oder == 'function', 'requestAnimationFrame' in window oder eine andere Methode, die keine Exception wirft.
Die Abfrage mit
if(!window.requestAnimationFrame) { /*...*/ }
funktioniert zwar
Na also.
aber die Zuweisung nachher trotzdem nicht.
Weil da derselbe Fall vorliegt.
Auch da muss man jeweils
window.
davorsetzen, damit es klappt.
Ja. »Globale Variablen sind in JavaScript nichts anderes als Eigenschaftes des globale Objektes window. Also kann man einfach if (window.globaleVariable)
bzw. if (window["globaleVariable"])
notieren. Der Vorteil gegenüber if (globaleVariable)
ist, dass das Script nicht mit einem Ausnahmefehler abbricht, wenn selbige Variable nicht existiert.« (a.a.O.)
Wenn du obj1.obj2 schreibst, so wird erst der Bezeichner obj1 aufgelöst (Identifier Resolution). Dabei kommt eine Referenz heraus. Dann wird der Property Accessor evaluiert. Es wird also eine Referenz auf die Eigenschaft »obj2« zur Basis von obj1 erzeugt. Wenn die Eigenschaft nicht existiert, so ergibt der Ausdruck lediglich undefined (vgl. ES5 8.12.3, [[Get]]). Eine Exception tritt nur auf, wenn obj1 eine nicht auflösbare Referenz ist (vgl. ES5 8.7.1, GetValue).
Stehe ich jetzt völlig auf dem Schlauch oder was ist da los? Seit wann kann man denn nicht mehr einfach die Existenz mit if abfragen?
Ähm – das konnte man noch nie.
Weil ich praktisch nie mit globalen Variablen arbeite, ist mir da vielleicht etwas engangen?
Bei lokalen Variablen ist es dasselbe. Wenn du eine nicht deklarierte lokale Variable ansprichst, dann gibt es ebenfalls eine Nullreferenz und einen entsprechenden ReferenceError.
function f () {
if (!husseldiguggeldidu) { alert('boom'); }
}
f();
Bei deklarierten Variablen (var-Statement oder formale Parameterliste) ist das was anderes. Diese existieren ja im Variablenobjekt bzw. Aktivierungsobjekt, haben aber zumindest den Wert undefined.
Mathias
P.S. Die Überarbeitung des Artikels ist gerade in der Veröffentlichung, die SELFHTML-Redaktion lässt auf sich warten. ;) Bei Interesse kann ich sie dir auch vorab mailen.