window.onerror - wo kommen die Argumente her?

N

Netzwerkidi

Schönen guten Abend!

Ich wundere mich gerade etwas, aber wo kommen

Fehlertext,
Filenname und
Fehlerzeile

beim window.onerror-event (sMessage, sUrl, sLine) her? "Out of thin air" wie das Geld der Banker, das sie dann als Kredit verleihen?

Beste Grüße


Code:
<html>
    <head>
        <title>OnError Example</title>
        <script type="text/javascript">
            alert("Syntax error.";
            window.onerror = function (sMessage, sUrl, sLine) {
                alert("An error occurred:\n" + sMessage + "\nURL: " + sUrl + "\nLine Number: " + sLine);
                return true;
            }
        </script>
    </head>
    <body onload="nonExistentFunction()">
    </body>
</html>

Quelle: http://www.java2s.com/Tutorial/JavaScript/0380__Window/Geterrorfileurl.htm
 
Na, bei jeder anderen Funktion müssen die Parameter doch irgendwo herkommen. Und hier sind sie einfach so da.

Also wenn ich schreiben würde

Code:
function bla (b1, b2) {
    alert(b1 + " / " + b2 );
  }
bla();

dann würde alert immer "undefined" anzeigen, weil b1 und b1 nie Werte hätten, weil ich ja nicht bla(1,2) sondern nur bla() aufrufe.

Grüße
Idi
 
Und der Browser ruft bei einem Fehler die onerror-Funktion auf und übergibt eben diese drei Parameter. Das ist bei allen anderen Events doch genauso. Bei onclick z.B. bekommst du auch das Event-Objekt als Parameter. Und onerror bekommt eben diese drei Parameter.

Edit: Wenn du es selbst aufrufst, bekommst du natürlich auch undefined

Javascript:
window.onerror();
 
Ups, scheint so, dass ich gerade erst einmal den Unterschied zwischen Funktionsreferenz und Funktionaufruf beginne zu erkennen (http://jszen.blogspot.com/2008/07/function-reference-vs-function-call.html), "(http://molily.de/js/event-handling-grundlagen.html#traditionelles-event-handling).

Und dann suche ich noch einer Liste, in der mal alle Parameter, die in so einer Funktionsreferenz verwendet werden können, falls man das so sagen kann, wie z. B. offenbar diese drei Parameter und in wohl auch genau dieser Reihenfolge aber mit frei wählbaren Namen bei onerror oder aber wie onclick wohl nicht, wenn ich Mozilla (https://developer.mozilla.org/en/DOM/window.onclick) da richtig verstehe.

Uiii, what a day, CPoly!
 
Zuletzt bearbeitet von einem Moderator:
Die Namen der Parameter kann man nicht nur in JavaScript frei wählen. Dem Aufrufer der Funktion kann auch egal sein, wie die Parameter in der Funktion benannt sind.
Was bei JavaScript aber ein großer Unterschied ist, dass es keine feste Parameterliste mit einer festen Anzahl gibt. Man kann jeder Funktion beliebige Parameter übergeben. Und innerhalb der Funktion hat man sogar ein Objekt namens "arguments" zur Verfügung, in dem alle Parameter stehen.

Javascript:
function foo() {
	for(var i = 0; i < arguments.length; i++) {
		alert(arguments[i]);
	}
}

foo("bar", "baz", 17, 23.5, true);

Funktionen sind auch nur Objekte der Klasse "Function". Deshalb kann man sie wie andere Werte in Variablen stecken. Und auch Methoden aufrufen. Es gibt sogar einen Konstruktor.

Javascript:
var foo = new Function("for(var i = 0; i < arguments.length; i++) {alert(arguments[i]);}");

foo("bar", "baz", 17, 23.5, true);
//oder
foo.call(this, "baz", 17, 23.5, true);
//oder
foo.apply(this, ["baz", 17, 23.5, true]);
 
Ahhhhh......laaaaaangsam dringt etwas Licht ins Dunkel!

Aber die Argumente auf ihre Bedeutung hin abfragen, also z. B. bei onerror die Bedeutungen Fehler + Datei + Zeile, das kann ich nicht mit dieser/m Loop, weil "arguments" kein object sondern einfach nur ein "dummes" array ist und sehr wahrscheinlich auch ein key-Wort. [Das war etwas voreilig, denn: http://www.seifi.org/javascript/javascript-arguments.html]

Wenn ich mir den onerror-Event z. B. bei W3Schools (http://www.w3schools.com/jsref/event_onerror.asp) ansehe, dann steht da nämlich nichts von den 3 Argumenten und deren Bedeutung, das muss man also irgendwo schon wissen oder ahnen oder abfragen.

Und was den weiter o. g. onclick-Event angeht, da wird also kein Argument übergeben, wenn ich das gerade richtig getestet habe, sondern der Event selbst mitgeteilt.

Code:
<html>  
<script>
function foo() {
    alert('foo');
    for(var i = 0; i < arguments.length; i++) {
        alert(arguments[i]);
    }
}
</script>
  <body>
    <button onclick="foo();">Foo me!
    </button>  
  </body>
</html>

Hast mir sehr geholfen, ein wenig mehr Erkenntnis zu erlangen. Das muss ich jetzt erstmal bei einem WB sacken lassen...

Schönen Tag noch!!

Idi
 
Zuletzt bearbeitet von einem Moderator:
Zurück