Funktionen und this
als Präsentation ▻In Javascript kann eine Funktion mit Namen definiert werden, oder anonym:
Javascript Code Funktionen definieren
function r1( s, x ) {
let result = "";
while( x ) {
result += s;
x--;
}
return result;
}
function ( s, x ) {
let result = "";
while( x ) {
result += s;
x--;
}
return result;
}
// Aufruf:
r1('*', 10);
Die zweite Funktion kann aber nicht aufgerufen werden.
▻Damit man eine anonyme Funktion verwenden kann, muss sie erst auf eine Variable zugewiesen werden:
Javascript Code Funktionen definieren
function r1( s, x ) {
let result = "";
while( x ) {
result += s;
x--;
}
return result;
}
let r2 = function ( s, x ) {
let result = "";
while( x ) {
result += s;
x--;
}
return result;
}
// Aufruf:
r1('*', 10);
r2('*', 10);
Seit Javascript 2015 gibt es doch eine weitere Schreibweise für anonyme Funktionen: die Arrow Function
Javascript Code Arrow Function
let f1 = ( s, x ) => {
let result = "";
while( x ) {
result += s;
x--;
}
return result;
}
Wenn die Funktion nur eine einzige Expression enthält wird die Schreibweise noch kürzer, man braucht gar kein return
mehr:
Javascript Code Arrow Function
let f2 = ( s, x ) => s + " mal " + x;
Und wenn die Funktion nur ein Argument nimmt kann man auch noch die Klammern rund um die Argumente weglassen:
Javascript Code Arrow Function
let f3 = x => `${x} ist das beste`;
Wir haben auch schon die JSON-Schreibweise von Arrays und Objekten kennen gelernt. Kombiniert mit der anonymen Schreibweise für Funktionen können wir so Funktionen als Teile von Objekten oder Arrays definieren:
Javascript Code Funktionen in JSON
objekt = {
prop1 : "Schokolade",
prop2 : 42,
method_1 : function (x) { return `${x} ist schlecht` },
method_2 : x => `${x} ist gut`
}
Die beiden Methoden kann man ganz normal aufrufen:
Javascript Code Methoden aufrufen
objekt.method_1("Kopfweh");
objekt.method_2("Eis");
objekt.method_2(objekt.prop1);
Achtung: Wenn das Objekt serialisiert wird, also in einem String gespeichert wird - z.B. um das Objekt in LocalStorage zu speichern oder über HTTP zu verschicken - dann gehen die Funktionen verloren!
▻Was ist this?
Die Variable this
hat eine besondere Bedeutung in Javascript Funktionen.
Erst einmal verweist this
auf das window
Objekt:
Javascript Code this in einer normalen Funktion
console.log("this = " + this);
function what_is_this() {
console.log("this = " + this);
}
what_is_this();
// output auf der Console:
// this = [object Window]
// this = [object Window]
Wird eine Funktion als Methode eines Objekts aufgerufen, dann verweist this
auf das Objekt:
Javascript Code this in einer Methode
var objekt = {
prop1 : "string",
prop2 : 42,
report : function () {
console.log( "this = " + this )
console.log( "this.prop2 = " + this.prop2 )
}
}
objekt.report();
// output auf der Console:
// this = [object Object]
// this.prop2 = 42
Achtung: Arrow Functions verhalten sich hier anders!
▻Eine Arrow Function hat nie ein eigenes this.
Wird eine Methode mit einer Arrow Function definiert, dann bezieht
sich this
also nicht auf das aufrufende Objekt, sondern behält seinen
Wert:
Javascript Code this in einer Methode
var objekt = {
prop1 : "string",
prop2 : 42,
broken_report : () => {
console.log( "this = " + this )
console.log( "this.prop2 = " + this.prop2 )
}
}
objekt.broken_report();
// output auf der Console:
// this = [object Window]
// this.prop2 = undefined