Brrr. Das eigentliche Problem hast Du nicht einmal berührt. Das Beispiel ist auf derart vielen Ebenen WTF, ich weiß gar nicht wo ich anfangen soll.
- Um eine Variable mit try/catch auf Existenz zu prüfen, muss man im strict-Mode arbeiten
- Im strict-Mode funktioniert das Beispiel aber nicht, weil beide Versuche einer "Erfolg" Abfrage einen ReferenceError werfen.
- Der "gute" Ausgang erfolgt per throw. Exceptions sollen aber den "bösen" Ausgang behandeln.
- Das Beispiel schmeißt mit Globals um sich und initialisiert die Variable Zähler nicht (was im strict mode ebenfalls einen ReferenceError wirft)
- Das Beispiel schmeißt etwas, das kein Error-Objekt ist, bzw. nicht die Mindestanforderung erfüllt, die Eigenschaften "name" und "message" mitzubringen. Das ist technisch möglich, gehört aber in diesen polnisch klingenden Kurort (Bad Practice)
Wenn schon, dann eher so:
"use strict"
setTimeout("x=3", 200);
teste_x(0);
function teste_x (z) {
try {
zeigeErgebnis(z, (x == 2) ? "erwartet" : "unerwartet");
} catch (e) {
if (e.constructor === ReferenceError)
setTimeout(function() { teste_x(z+1); }, 30);
}
}
function zeigeErgebnis (Zaehler, Ergebnis) {
alert("Nach " + (Zaehler) + " Durchläufen existierte x.\nDie Zahl x ist " + Ergebnis + ".")
}
Aber auch da steckt noch ein WTF Würmchen drin: Der setTimeout, der x=3 setzt, ist ein versteckter eval(), der den Strict-Mode abschaltet und damit das implizite Erzeugen von x ermöglicht. Schreibt man dort function() { x=3; } hin, crasht dieser Timeouthandler. Alles Dinge, die man im Artikel erwähnen müsste und womit man vom Thema ablenkt.
Wenn mir ein besseres Beispiel einfällt, werde ich da mal aktiv werden (sofern sonst keiner schneller ist).
Rolf
--
sumpsi - posui - clusi
sumpsi - posui - clusi