Wirkfunktionen in JavaScript
Ein Ausgabefunktion gibt einen ihr übergebenen Wert aus.
In JavaScript gibt es keine immer verfügbare Ausgabefunktion als festen Teil der Sprache. Zum Lernen ist es allerdings hilfreich, wenigstens vorläufig, eine Ausgabeanweisung zu verwenden. Oft steht auch eine Ausgabeanweisung zur Verfügung, die aber nicht unter jeder Umgebung gleich ist. Wir nehmen für diese Lektion eine bestimmte Schreibweise einer Ausgabeanweisung an, die unter vielen, aber nicht unter allen, Umgebungen auch verfügbar ist. Falls die hier vorgestellte Ausgabeanweisung nicht verwendbar ist, kann dem Handbuch der verwendeten Umgebung aber meist eine andere Ausgabeanweisung entnehmen werden, welche dann an Stelle der hier vorgestellten verwendet werden sollte.
Die Ausgabefunktion »console.log« kann in vielen Browsern verwendet werden.
Die Ausgabefunktion »console.log« gibt die Werte der ihr übergebenen Ausdrücke auf die Konsole aus.
- Konsole
window.console.log( "abc" )
abc
undefined
Die Ausgabe von »abc« ist die Wirkung der Auswertung des eingegebenen Ausdrucks.
Wenn die Auswertung eines Aufrufs einer Funktion eine Wirkung hat, dann nennen wir jene Funktion eine Wirkfunktion.
»window.console.log« ist ein Beispiel für eine Wirkfunktion. Die Auswertung des Aufrufes »window.console.log( "abc" )« bewirkt eine Ausgabe, also hat sie eine Wirkung. Zuvor hatten wir in diesem Kapitel schon die Zuweisung als Beispiel eines Wirkoperators kennengelernt.
Man sieht darunter noch den Wert des Ausdrucks »windows.console.log( "abc" )«, dies ist »undefined«. Dieses wenig informative »undefined« lassen wir zukünftig bei der Wiedergabe von Konsoleninhalten machmal weg.
In der Konsole von Mozialla Firefox 38 wird der Wert eines eingegebenen Ausdrucks in Anführungszeichen gesetzt, wenn der Wert eine Zeichenfolge ist und diese insgesamt so dargestellt, daß sie im Quelltext verwendet werden kann. Bei der Ausgabe einer Zeichenfolge mit »windows.console.log« geschieht dies aber nicht.
- Konsole
'a"b'
"a\"b"
- Konsole
console.log( 'a"b' )
a"b
Mit Hilfe von »console.log« können wir endlich die Zeichenfolge eine Zeichenfolgenliterals sehen, ohne daß zu dieser noch Anführungszeichen hinzugefügt werden!
Main.html
<em id=a>abc</em>
- mögliche Anzeige in Web-Browser
- abc
- Auswertung
a.outerHTML
"<em id=\"a\">abc</em>"
- Auswertung
console.log( a.outerHTML )
<em id="a">abc</em>
Das folgende Beispiel zeigt die Ausgabe der Werte mehrerer Auswertungen.
- Konsole
window.console.log( k = 2, k + 3 )
2 5
Eine Klammerpfeilfunktion mit einer Wirkung
Es ist auch möglich »console.log« innerhalb einer Funktion zu verwenden, um bei Aufruf der Funktion etwas auszugen. Das Ergebnis solch einer Funktion ist dann »undefined«.
- Konsole
p = ()=> window.console.log( "abc" )
function p()
- Konsole
p()
abc
undefined
Die Reihenfolge der Auswertung von Argumenten
Bei der Auswertung mehrerer Argumentausdrücke eines Aufrufs wird von links nach rechts vorgegangen, das erste Argument wird also vor dem zweiten ausgewertet. (Ecma 262 2015, ArgumentListEvaluation 12.3.6.1: “ArgumentList : ArgumentList , AssignmentExpression ”)
- Konsole
this.Math.pow( window.console.log( "abc" ), window.console.log( "def" ))
abc
def
NaN
Wir können diese Reihenfolge der Auswertung erst mit Hilfe von Wirkfunktionen auf einfache Weise beobachten.
Der toString-Eintrag eines Verzeichnisses
Zunächst wird ein globaler Schlüssel »x« an eine Funktion »()=>0« gebunden.
- Auswertung
x = ()=>0
function x()
Bei der Verkettung mit einer leeren Zeichenfolge wird die Funktion »x« in eine Zeichenfolge (hier »()=>0«) gewandelt.
- Auswertung
String( x )
()=>0
Der Schlüssel »toString« des Verzeichnisses »x« wird nun an eine parameterlose Funktion gebunden, welche den Namen »Anton« ergibt.
- Auswertung
x.toString = ()=>"Anton"
function x.toString()
Bei der Wandlung eines Verzeichnisses in eine Zeichenfolge verwendet eine ECMAScript -Implementation das Ergebnis einer eventuell vorhandenen Funktion mit dem Schlüssel »toString« als Zeichenfolge. Daher hat der Ausdruck »x + ""« nun die Zeichenfolge »Anton« als Wert.
- Auswertung
String( x )
"Anton"
Durch Bindung des Schlüssel »toString« eines Verzeichnisses an eine geeignete Funktion können wir die Zeichenfolgendarstellung des Verzeichnisses festlegen.
Wird das Verzeichnis statt dessen mit »console.log( x )« ausgegeben werden, so könnte ein spezielles Ausgabeverfahren der Konsole verwendet werden, bei dem der Eintrag »toString« nicht berücksichtigt wird.
- Auswertung
console.log( x )
function x()
Um die von ECMAScript festgelegt Zeichenfolgendarstellung auszugeben, sollte diese zunächst mit »String« erzeugt werden, da außerhalb von ECMAScript festgelegt Funktion, wie die vom Browser festgelegte Funktion »console.log« abweichende Verfahren verwenden könnten, um das Auszugebende in einen Text zu verwandeln.
- Auswertung
console.log( String( x ))
"Anton"
Problemratgeber
Wenn in der Konsole von Firefox das Rechteck [Logbuch] (englisch: [Logging]) deaktiviert ist, dann werden die mit »console.log« erzeugten Ausgaben nicht angezeigt. Unter Umständen kann es dann nötig sein, dieses Rechteck zu aktivieren und dann Firefox neu zu starten!
Wenn ein Skript mehrfach hintereinander Zeilen mit demselben Text ausgibt, dann werden diese Zeilen unter manchen Konsolen manchmal zu einer Zeile zusammengefaßt und die Anzahl der Wiederholungen der Zeile durch eine Zahl ausgedrückt. Gibt man also beispielsweise drei Mal hintereinander die Zeile »Hallo, Welt!« aus, so erscheint manchmal etwas wie »Hallo, Welt! (3)«.
Übungsfragen
? Übungsfrage
Welchen Wert hat der folgende Ausdruck und warum?
- Ausdruck
console.log( 2 )+ 0
? Übungsfrage
Was wird von der zweiten Anweisung ausgegeben?
- Ausdruck
w = console.log( 2 );
w = console.log( w );
Übungsaufgaben
/ Übungsaufgabe
Schreiben Sie eine Funktion »f«, deren Aufruf den Wert »4« ergibt, und eine Funktion »g«, bei deren Aufruf die Zeile »4« auf die Konsole geschrieben wird.
- Auswertung
e = f()
4
- Auswertung
e
4
- Auswertung
g()
4
undefined
- Auswertung
e = g()
4
undefined
- Auswertung
e
undefined
? Reihenfolge von Operationen
Bei der Auswertung des weiter unten stehenden Ausdrucks, werden die folgenden vier Operation (Rechenschritte) ausgeführt.
- A) »this.Math.imul( 2.0, 2.2 )«,
- B) »this.Math.floor( 2.7 )«,
- C) »this.parseFloat( "2.2" )« und
- D) »"2." + "2"«.
Diese vier Operationen werden aber bei der Auswertung des ganzen Ausdrucks nicht unbedingt auch in dieser Reihenfolge „A, B, C, D“ ausgeführt. In welcher Reihenfolge werden sie ausgeführt?
- Ausdruck
this.Math.imul( this.Math.floor( 2.7 ), this.parseFloat( "2." + "2" ))
/ Übungsaufgabe
Schreiben Sie eine Funktion »w«, deren Aufruf eine Zufallszahl zwischen 1 und 6 (einschließlich) ergibt, und eine Funktion »pw«, bei deren Aufruf mit »console.log« eine Zufallszahl zwischen 1 und 6 auf die Konsole geschrieben wird. Dabei sollte die Funktion »w« in der Definition der Funktion »pw« verwendet (aufgerufen) werden.
Quellen *
- Herstellerunabhängige Spezifikation
- “The logger operation accepts a log level and a List of other arguments. Its main output is the implementation-defined side effect of printing the result to the console.”
https://console.spec.whatwg.org/