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