Autor Zpráva
Suta
Profil
Omlouvam se za nepouziti diakritiky, jsem ve francii a pisu na francouzske klavesnici...

Jak se zbavit kontextu promenne? mam takovouto funkci:

for(var i=0; stylNameArray.length>i; i++) {
          neco[i].onclick = function() {
                  zmenaStylu("styl_pozadi_oken_0" + i);
          }
}

fungovat by to melo tak, ze pri kliknuti na:
element neco[0] by mela byt spustena funkce zmenaStylu s parametrem styl_pozadi_oken_00
pri kliknuti na element neco[1] by mela byt spustena funkce zmenaStylu s parametrem styl_pozadi_oken_01 ... atd

ale bohuzel se to chova tak, ze dana funkce je volana vzdy s parametrem napr. styl_pozadi_oken_05, za predpokladu ze cyklus probiha 5x (tedy drzi si kontext promenne i, ktera ma po skonceni cyklu hodnoutu 5)

priradi ne hodnotu "0","1","2"... ale odkaz na promennou i ! a tim padem pri zavolani funkce je funkci predana vzdy hodnota promenne i...

potreboval bych neco, co priradi aktualni hodnotu promenne i bez ohledu na to, zda-li bude v budoucnu zmenena, ne odkaz na ni.

Diky za pripadnou pomoc.

Edit:
Ted zjistuji, ze neuspeji ani s:
          $("m_3_1_1_" + i).onclick = function() {
                  if(i==0) zmenaStylu("styl_pozadi_oken_0" + "0");
                  if(i==1) zmenaStylu("styl_pozadi_oken_0" + "1");
                  if(i==2) zmenaStylu("styl_pozadi_oken_0" + "2");
                  if(i==3) zmenaStylu("styl_pozadi_oken_0" + "3");
          }
// pri kliknuti na jakykoliv prvek m_3_1_xxx bude vzdy zavolana funkce zmenaStylu s parametrem styl_pozadi_oken_03.... jak se toho jen zbavit...

Moderátor Chamurappi: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
Leo
Profil
Zkuste toto

for(var i=0; stylNameArray.length>i; i++) {
   (function(){
     var n = i;
     neco[i].onclick = function() {
      zmenaStylu("styl_pozadi_oken_0" + n);
    }
   })();
} 


Leo
Chamurappi
Profil
Reaguji na Lea:
Jednodušší na úpravu asi bude, když si vyrobí lokální „i“ jako argument funkce a strčí do něj aktuální hodnotu při volání:
for(var i=0; stylNameArray.length>i; i++) {
   (function(i){
     neco[i].onclick = function() {
      zmenaStylu("styl_pozadi_oken_0" + i);
    }
   })(i);
}

Reaguji na Sutu:
Říká se tomu lexikální uzávěr (anglicky closure).
Suta
Profil
Leo:
Funguje, diky moc. Muzu jeste poprosit o vysvetleni principu? Automaticky provedene funkci rozumim, jen nevim, kde presne ztraci promenna n spojitost s puvodni promennou i...
Suta
Profil
Chamurappi:
Aha, takze lokalni promenna. Nyni rozumim. Predevsim diky za termin lexikální uzávěr (anglicky closure), uz jsem podobne situace resil vicekrat a vzdy jsem to musel resit slozite. Nyni vim pod cim hledat.

Diky moc!

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:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0