[ Webhosting profitux.cz ]
v6ak [ programování, bezpečnost, web, php, java, ... ] (Vít Šesták)
Buzz - v6ak Twitter - v6ak

štítky

Callback s kontextem v JavaScriptu

Když předáváte callback (napříkladu třídy XMLHttpRequest), může se hodit, aby věděl, k čemu patří. Chcete mu předat proměnnou, ale nemůžete při volání, protože to je obslouženo někým jiným. Musíte dřív.

První řešení je použití globální proměnné. V mnoha učebnicových příkladech je to naprosto dostačující. Ale co když chcete více callbacků zároveň?

Jak to řeší jiné jazyky?

Java

V Javě není možné předat callback jako takový. Proto se obvykle předává objekt implementující nějaké rozhraní. A objekt si s sebou může nést vlastnosti.

PHP

V PHP5 se to dnes řeší pomocí objektů. Pokud předáváte callback, předáte array(objekt, 'metoda') a je to.

Další možnost je použít Javové řešení. Ale o tom se rozhodnete spíše na základě již existujícího API.

V PHP 5.3 je tu nová možnost: closures - prostě určíte proměnné, na které má anonymní funkce vidět.

A jak to udělat v JavaScriptu?

Některé frameworky (např. Prototype) mají bindovací funkce, kterými to lze zařídit ve stylu PHP5. Ale JavaScriptové frameworky jsem si moc neoblíbil (mimo jiné kvůli ignoraci jmenných prostorů) a navíc jsou příliš velké protento účel. A bylo by zbytečné, kdyby klient musel tahat kvůi tomuto celý framework.

v JavaScriptu jsou ale anonymní funkce a closury. Closury však nejsou možná na první pohled viditelné, protože se o ně JavaScript stará automaticky. Jde to udělat například:

function mkUserLoadHandler(el, xhr){ return function (){ if( xhr.readyState == 4 ){ ... // tato funkce vidí na podaný el a xhr }; }; };
Funkce mkUserLoadHandler vytvoří nový callback, kterému předá proměnné el a xhr. Pokud máte XMLHttpRequest, můžete to využít takto:
req.onreadystatechange = mkUserLoadHandler(more, req);

Nemám si dát na closury v JavaScriptu pozor?

Nejsem žádný JS profík, ale pochybuji, že interpret tohoto netypového jazyka nějak pozná, které proměnné chcete předat. Takže zřejmě předává všechny viditelné proměné. To nemusí být vždy žádoucí. Proto jsem na to vytvořil extra funkci, která dostává jen ty parametry, které má skutečně předávat.

Diskuzi ke článku naleznete zde.

Linkování

Líbí se Vám tato stránka? Zalinkujte ji!

Chcete sledovat novinky? Pokud si právě prohlížíte článek a hledáte RSS pro celý web, pak jste trošku jinde. Možná hledáte poslední změny.

Validní HTML 4.01 StrictValidní CSS 2.0Validní hlavní RSS kanálPHP 5Apache
referer: UA:CCBot/2.0 (http://commoncrawl.org/faq/) time:0.29439300 1498484669
web
mail
comment