Autor Zpráva
polom
Profil *
Ahoj,
narazil jsem na takový problém a nevím jak se mám rozhodnout. Možná mi pomůžete, potřebuju vědět, které řešení je nejlepší.

Relativně nedávno jsem se dozvěděl, že programátor by se měl snažit o to, aby v globalu bylo co nejméně proměnných. Také jsem četl názor, že když mám funkci obsahující vnitřní funkci:
function test(){
pokus = function(){} // vnitřní funkce
}

mělo by se to spouštět ne jako normální funkce, ale jako uzávěra, protože ta vnitřní funkce by se jinak pokaždé definovala znovu. Jenže když použiju uzávěru, tak mi automaticky s každou takovou funkcí do globalu přibude jedna globální proměnná, která obsahuje funkci. Při větším počtu funkci už se znepřehledňuje scope. Přesto používat uzávěry?

Přece jednodušší řešení by bylo rozdělit to a obě funkce hodit do globalu:
function pokus(){} // vnitřní funkce
function test(){
}

Ano, tady je zase problém s tím, že proměnné z funkce test nejsou přístupné pro pokus a naopak.

Když ale použiju tu uzávěru:
function test(){
// definiční část: proměnné a vnitřní funkce
function pokus(){} // vnitřní funkce
// uzávěra:
return function(){}
}
closure = test();

Tak jednak mi přibude ta globální proměnná a potom zdá se mi, že proměnné z uzávěry nejsou přístupné v té vnitřní funkci. Takže když bych z uzávěry volal pokus() tak ta nebude vůbec spolupracovat s uzávěrou. Musel bych tam všechny proměnné dostat pomocí argumentů pokus(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q...) a to mi přijde strašně pracné, zdlouhavé a neefektivní. Předělat původní kód s vnitřní funkcí na uzávěru s vnitřní funkcí je nějak moc složité, spousta ladění a hledání kde co a proč nejede a kterou proměnnou jsem zapomněl přidat do argumentů... Není to jen přidání té uzávěry return function (){} a inicializace uzávěry. Nevím jaké řešení mám zvolit, abych nedělal něco co nemá žádný smysl.
__construct
Profil
Peto:
To je pekná blbosť.. Nemá to byť náhodou takto :
var Objekt = {
    zakric: function(){
            alert(arguments);
    },
    zapis: function(){
            console.log(arguments);
    }
};
//edit: Komentár od peta je preč ..
polom
Profil *
Nevím co se tu odehrálo, pokud je ale uvedený kód od __constuct pro mě, pak nevím jak ho použít nebo co tím získám? Uvedené funkce nemají sdílené proměnné. V mém posledním kódu, který jsem uvedl, bych mohl v rodičovské funkci deklarovat proměnné, které chci zpřístupnit ve vnitřní funkci. Problém je ale v tom, že těch proměnných, které používá uzávěra, je opravdu dost. A jelikož předělávám starou formu kódu na nový, musím hledat všechny proměnné, které jsem v té uzávěře použil a deklarovat je. Hází to spoustu chyb a nevím na jak dlouho to bude. Zdá se mi to takové nězdravě komplikované...

function test(){
var a,b,c,d,e,f,g,h,i,... // celá řada proměnných, které musím najít v uzávěře
function pokus(){
// tato funkce potřebuje zpřístupnit proměnné a,b,c,d,e,f,g,h,i,... z uzávěry
}
return function(){ // uzávěra
// zde kód, který připravuje nebo ovlivňuje proměnné a,b,c,d,e,f,g,h,i,...
}
}
closure = test();

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0