Autor | Zpráva | ||
---|---|---|---|
polom Profil * |
#1 · Zasláno: 22. 9. 2010, 15:28:26
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 |
#2 · Zasláno: 24. 9. 2010, 09:14:11 · Upravil/a: __construct
Peto:
To je pekná blbosť.. Nemá to byť náhodou takto : var Objekt = { zakric: function(){ alert(arguments); }, zapis: function(){ console.log(arguments); } }; |
||
polom Profil * |
#3 · Zasláno: 24. 9. 2010, 11:09:28
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(); |
||
Časová prodleva: 14 let
|
0