5 komentáře “JavaScript Closures – překvapení Java programátora

  1. Tak tento clanok je fakt super. Makam momentalne na vacsiom projekte (projektoch), kde vyuzivame aj dost Javascriptu a komunikaciu s Ajaxom a toto vyzera velmi dobre. Asi to aj pouzijem, len to musim este poriadne kuknut.

  2. Na Groovy se chystám už od jara. Odkládám to už moc dlouho – o Vánocích se do toho pustím a čím dál víc se na to těším. Díky za info.

  3. Pekne zhrnutie,
    rovnako som v nedavnej dobe pracoval s DWR a JQuery. Javascriptovy kod sa nam zacal hromadit skoro na kazdej stranke a tak bola nutnost napisat nejaku abstrakciu na volanie DWR a veci okolo toho, tam sa closury na par miestach vyuzili.

    Vrelo odporucam knihu, Pro Javascript Techniques od autora JQuery. Priznam sa, ze to bola moja prva JS kniha, ktoru som cital (pred tym som cital vacsinou zdroje na webe, ktorych je v celku dost). Je prelozena aj do cestiny ale v anglictine je to viac ono. Hned od uvodu sa venuje objektovemu javascriptu, closuram a podobne, proste veci, ktore su velmi podstatne ale nejak som sa o nich vo webovych tutorialoch nikdy nedocital. Priznam sa, ze predtym som Javascript nemal rad, ale po prestudovani ako veci funguju som prisiel tomuto jazyku na chut.

    PS: momentalne sa hram s groovy a s jeho closurami, a po mojom testiku mozem potvrdit, ze fungovanie je velmi podobne javascriptu aspon co sa tyka tych kontextov:

    def getFunction1(param1) {
    return [
    {it ->
    param1++;
    println „$it $param1“
    },
    {it ->
    param1++;
    println „$it $param1“
    }
    ]
    }

    getFunction1(1).each {it(„param“)}

    Vysledok:
    >> param 2
    >> param 3

    // fix
    def getFunction2(param1) {
    return [
    {it ->
    def _param1 = {param1}();
    _param1++;
    println „$it $_param1“
    },
    {it ->
    def _param1 = {param1}();
    _param1++;
    println „$it $_param1“
    }
    ]
    }

    getFunction2(1).each {it(„param“)}

    Vysledok:
    >> param 2
    >> param 2

  4. Super clanek, snad prvni vec o javascriptu, co jsem docetl az do konce. Skoda, ze porad nezmenil muj nazor na javascript 😀

  5. Díky za komentáře. Z nich si pro sebe vyvozuji to, že přestože jsem si už tak trochu zažil chování closures, ještě stále dost plavu na povrchu v detailech konkrétní implementace v JavaScript enginu. No snad nikoho tímhle článkem nepřivedi příliš na scestí.

  6. Chápu, že programátoři v Javě apod. jsou zvyklí operovat se zásobníkem jako místem, kam se ukládají lokální proměnné, ale vzhledem k tomu, že tady „lokální“ proměnné mohou svůj lexikální obor platnosti „přežít“, ve skutečnosti nejsou na zásobníku, ale normálně na heapu. Trochu jsem o tom psal, ve spojitosti s Javou, tady: http://www.abclinuxu.cz/blog/variace/2006/10/prvotridni-java

    > ta hlavní výhoda closures – že si s sebou vezou lokální kontext – mi osobně připadá jenom jako trošku zakamuflované globální proměnné

    Jo jo jo jo jo, to jsou úúúúúplně normální globální proměnné, akorát že nejsou globální 🙂 „Doba života“ se sice liší od lexikálního oboru platnosti, ale ten je pořád zachován, žádná „práce s proměnnou mimo její kontext“ neexistuje.

  7. Na closures v JS je podle mne největší pastička v tom, že mohou být volány i jako funkce i jako metody, takže dopředu nikdy není jasné, na co bude odkazovat uvnitř closure „this“.

    No a ta hlavní výhoda closures – že si s sebou vezou lokální kontext – mi osobně připadá jenom jako trošku zakamuflované globální proměnné, aby se programátorům, kteří někdy slyšeli, že globální proměnné jsou fuj, neježily hrůzou vlasy na hlavě. Jinak je to v podstatě to samé, umožňuje to pracovat s nějakou proměnnou mimo její kontext, aniž bych tu proměnnou musel explicitně předávat jako parametr.