JavaScriptové perličky II.

Otázka:

Co udělá následující kus kódu v prohlížeči?

<script language="text/javascript">
  function f() {
    function g() {
      document.write("g");
    }
    document.write("f");
  }

  f();
  f.g();
</script>

Odpověď:

  1. Internet Explorer nahlásí chybu "Objekt tuto vlastnost nebo metodu nepodporuje" na řádku f.g().
  2. Opera nahlásí na stejném řádku chybu "Expression did not evaluate to a function object."
  3. Mozilla jediná správně vypíše text "fg".

O co v tom skripu vlastně jde? V JavaScriptu platí dva axiomy:

(A1) Ve funkci se rekurzivně volá stejný parser, který zpracovává nejvyšší úroveň skriptu.

(A2) Funkce je objekt.

Důsledkem A1 je možnost uvnitř funkce dělat totéž, co na nejvyšší úrovni, tj. například ddefinovat vnořené funkce. Důsledkem A2 je to, že takto vytvořené funkce se stanou vlastnostmi nadřazeného objektu, a je k nim tedy možné přistupovat přes tečkovou syntaxi. Stačilo mi, když jsem si tyto vlastnosti uvědomil a skriptík byl na světě.

Jak je vidět, nejenom v matematice funguje axiomatický přístup k věcem. (A jak je vidět, Microsoft ani Operu axiomy příliš nezajímají :-)

Výše uvedené vlastnosti se dají využít k věci, která se hodí u velkých projektů – jmenné prostory (namespaces). Prostě všechny funkce a proměnné z každého modulu vnoříte do obalující funcke a pak k nim přistupujete z vnějšku přes tečkovou syntaxi, díky čemuž zamezíte konfliktům jmen. Velmi nečisté, leč velmi účinné.