JavaScriptové perličky IV.
Ve svém posledním povídání o literálech jsem zapomněl na jeden důležitý literál – funkci. Ano, v JavaScriptu jde snadno udělat velice hezká věc, kterou někteří možná znají z Lispu – lambda funkce. Jde o to, že pokud chcete například někam jako parametr předat funkci (přesněji referenci na funkci), můžete ji napsat "inline" rovnou na místo, kde ji chcete předávat. Příklad:
Po staru (bez lambda funkce):
function compare(a, b) {
return b - a;
}
someKindOfSort(items, compare);
Po novu (s lambda funkcí):
someKindOfSort(items, function(a, b) { return b - a; });
Hezké využití lambda funkcí je u obsluhy událostí. Poprvé jsem to viděl v ActionScriptu u Flashe, kde se tento obrat používá opravdu hojně, ale nic vám nebrání používat lambdy třeba i u HTML/DOM:
document.getElementById("button").onclick = function() { alert("Hello!"); };
Úplně nejdůležitější použití mají ale lambda funkce u definic prototypů objektů. K tomu se používá objektový literál, kde se definují vlastnosti třídy objektu pomocí této syntaxe:
Trida.prototype = {
vlastnost1: hodnota1,
vlastnost2: hodnota2,
...,
vlastnostN: hodnotaN
}
Jako hodnotu vlastnosti můžete zadat lambda funkci a příslušná vlastnost se pak stane metodou objektu. Příklad:
HashTable.prototype = {
items: {}, // prázdný objekt
set: function(key, value) {
this.items[key] = value;
}
}
Nice, isn't it?
Poznámka bokem: Neděste se, pokud vám nic neříká konstrukce
prototype. Taky se k ní jednou dostanu...