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...