Meine Herren!
હેલો
Danke erstmal für die Ausführliche Antwort.
b dagegen ein „function expression“, genauer ist b sogar ein „named function expression“.
b(); scheint ja immer undefined, auch wenn ich es nach der Funktion aufrufe
An sich ja ok, aber wie kann ich diese Anonyme Funktion dann Rekursiv aufrufen, wenn ich sie nicht über den Namen ansprechen kann?
Rekursiv bedeutet ja, dass sich die Funktion selbst wieder aufruft. In diesem Beispiel ist „b“ weder vor der Funktions-Definition noch danach ein gültiger Bezeichner für die Funktion, aber _innerhalb_ der Funktion ließe sich der Bezeicher wiederverwenden:
// !!! ACHTUNG !!! Endlos-Rekursion! Besser nicht ausführen.
(functin b(){
b(); // rekursiver Aufruf
});
Wenn man außerhalb der Funktion eine Referenz darauf benötigt, weisen speichern wir eine Referenz der Funktion in einer Variablen.
var a = function b(){
};
a();
Der Sinn ist soweit denke ich klar. Das ich den Wert einer Variable direkt mit einer Anonymen Funktion bearbeiten kann, kannte ich von PHP. Nur welchen Sinn macht es, einer Anonymen Funktion einen Namen zu geben?
Wie gesagt, die Funktion kennt ihren eigenen Namen und weiß daher, wie sie sich selbst aufrufen kann.
foo.bar = function(){
console.log('foo.bar invoked');
};
> Fehlen hier Klammern, oder schreibt man das in diesem Fall tatsächlich so?
Du meinst diese Klammern?
~~~javascript
foo.bar = (function(){
console.log('foo.bar invoked');
});
Gut beobachtet. Aber in diesem Fall können wir die umschließenden Klammern tatsächlich einfach weglassen. JavaScript-Interpreter entscheiden anhand des Kontextes, ob es sich um einen function-expression oder -statement handelt. Mit den umschließenden Klammern teilen wir dem Interpreter ausdrücklich mit "jetzt kann nur ein expression" kommen. Der Zuweisungs-Operator macht das gleiche, auf der rechten Seite darf nur ein expression stehen. Es besteht für den Interpreter also keine Verwechslungs-Gefahr.
[1,2,3].reduce( function( previsous, next){
return previous + next;
},0);
>
> WZT? Was ist „[1,2,3].reduce()“? Wofür stehen die Werte in den Eckigen klammern?
Okay das war ziemlich viel Voodoo.
Mit den eckigen Klammern erzeugen wir ein Array, das ist die Literal-Schreibweise, die auch in JSON übernommen wurde. [1,2,3] erzeugt folglich ein Array mit den Einträgen 1, 2 und 3.
In JavaScript sind Arrays standardmäßig Objekte und können deshalb Methoden haben. mit .reduce rufen also nur eine Methode des Arrays auf.
`[1,2,3].reduce( callback )`{:.language-javascript} ist das ungefähre JavaScript Pendant zu dem PHP-Code:
`array_reduce( array(1,2,3), 'callback' );`{:.language-php}
Die reduce-Funktion wird benutzt, um ein Array auf einen neuen Wert abzubilden. Das Beispiel summiert einfach alle Einträge auf. Das Ergebnis ist also 6 ( 1 + 2 + 3 ).
> Das muss ich noch verinnerlichen, gerade mit Callback-Funktionen habe ich noch enorme schwierigkeiten. Kannst du vielleicht mit einfachen Worten erklären, welchen Sinn genau Callback-Funktionen haben?
Mit Callback-Funktionen bezweckt man eine Umkehrung der Verantwortlichkeit (im Englischen: reverse of control, klingt sehr viel schöner). Wenn wir zum Beispiel einen Button haben und eine Funktion ausführen wollen, wenn dieser geklickt wird, dann gibt es im Wesentlichen zwei Methoden das umzusetzen:
1) Wir pullen den Zustand des Buttons. D.h. wir fragen kontinuirlich den Zustand des Buttons ab und führen unsere Funktion aus, wenn dieser geklickt wurde.
2) oder wir sagen dem Button "du weißt doch am besten, wenn du geklickt wurdest, also nimm doch bitte diese Funktion und führe sie dann aus". Wir übergeben sozusagen die Kontrolle an den Button.
Im Web benutzt man ausschließlich die zweite Variante. Auf hardwarenahe Ebene, zum Beispiel bei Mikrocontrollern findet man auch häufig die erste Variante.
In dem Beispiel hab ich es mir einfach gemacht und ein Szenario gewählt, das intuitiv irgendwie asynchron abläuft. Aber man nutzt Callbacks auch in synchronen Szenarion, wie das array.reduce-Beispiel hoffentlich illustriert hat.
> ~~~javascript
$(function(){
> >
> > });
es ist also nur eine andere schreibweise für:
$(document).ready( function() {
});
> Das ist gut zu wissen. Dann kann mich endlich dieses lästigen document.ready entledigen. War mir schon lange ein Dorn im Auge :)
Das ist Geschmackssache und sollte nicht unbedingt gemacht werden, nur weil es geht. Die Schreibweise, die du bisher benutzt hast, ist deutlich aussdruckssärker. Ein Programmierer, der diese Variante liest, weiß sofort was Sache ist, die Kurzschreibweise dagegen sagt wenig darüber aus, was tatsächlich passert. Deswegen musstest du ja auch nachfragen ;)
--
“All right, then, I'll go to hell.” – Huck Finn