Mir fällt immer wieder auf, dass es viele Web Developer gibt, die den Funktionsumfang von Javascript nicht kennen/nutzen, bzw. diese Sprache komplett unterschätzen - "Ist ja nur eine kleine eingebettete Skriptsprache". Soeben bin ich auf den Blog von
Ola Bini gestossen,
in dem er sich wundert, dass man in Javascript beispielsweise über den Array-Operator auf die Methoden eines Objektes zugreifen kann.
Bei Javascript handelt es sich (wie auch beispielsweise bei
Lisp) um eine
Funktionale Sprache, was u.a. impliziert, dass Funktionsreferenzen als Parameter übergeben werden können, oder eine Funktion eine andere Funktion als Rückgabewert haben kann, wozu ich ein cooles Codebeispiel habe:
var Configuration = Class.create();
Configuration.prototype = {
_config : null,
initialize: function(config) {
this._config = config;
},
get: function(key) {
return function(vars) {
return (new Template(this._config[key])).evaluate(vars);
}.bind(this);
}
};
Hierbei handelt es sich um ein der Anschaulichkeit vereinfaches Beispiel einer kleinen Template Engine in Javascript, da ich nach einer Möglichkeit gesucht habe, serverseitige Daten initial elegant an ein includiertes Javascriptfile zu übergeben. Aber ich will nicht vom Thema abschweifen...
Schauen wir uns die
Configuration::get() Methode an - sie nimmt einen Parameter, der das Template mit einem sog. Hash (oder einem Schlüssel) identifiziert und sofort eine anonyme Funktion zurückgibt, die als Parameter ein JSON Objekt nimmt, welches der
evaluate() Methode aus Prototypes
Template-Klasse übergeben wird.
Die anonyme Funktion tritt also erst in Aktion, nachdem sie explizit ausgeführt wird, wozu sie sich den Wert von
key in einem internen Funktionsenvironment speichern muss.
Angenommen, wir hätten die Configuration bereits mit einem trivialen Template initialisiert, so können wir die anonyme Funktion über den entsprechenden Key abrufen und diese dann mit den Ersetzungswerten aufrufen:
var cfg = new Configuration({say_hallo: 'Hallo #{firstname} #{lastname}, wie gehts?'});
// fetch anonymous function
var fn = cfg.get('say_hallo');
// call anonymous function
var text = fn({firstname: 'Marc', lastname: 'Kreibich'});
Tja... und da Javascript wirklich so eine schöne Sprache ist, geht das natürlich auch noch einfacher, indem wir die anonyme Funktion direkt aufrufen, ohne sie in einer temporären Variablen zwischenzuspeichern:
var text = cfg.get('say_hallo')({firstname: 'Marc', lastname: 'Kreibich'});
Einer der vielen Gründe, wieso es sich lohnt sich mit Javascript einmal richtig auseinanderzusetzen!