Autor Zpráva
Misha
Profil *
U funkce Reverse jsem se setkal s něčím, u čehož si nejsem jist, že by to tak mělo opravdu fungovat. A tak bych potřeboval trochu poradit a poučit.

<script type="text/javascript">
function navig() {
  var poziceElementuR = new Array(); // vytvoření lokální proměnné
  poziceElementuR = poziceElementu; // zkopírování obsahu proměnné
  poziceElementuR = poziceElementuR.reverse(); // otočení obsahu proměnné
  document.write(poziceElementuR.join()); // vypíše obrácený obsah pole
  document.write(poziceElementu.join()); // také vypíše obrácený obsah pole
  // navíc pokud funkci provedu 2x, tak se pořadí střídá (jako by proměnná poziceElementuR byla globální) 
}

poziceElementu = new Array(); // vytvoření globální proměnné
poziceElementu[0] = 251; 
poziceElementu.push(9);
poziceElementu.push(65487);

navig();
</script>

Umíte mi to někdo vysvětlit? Nebo kde dělám chybu, když chci aby v proměnné poziceElementuR bylo pořadí obrácené, ale v poziceElementu nebylo?
Davex
Profil
Není to způsobeno metodou reverse(), ale tím, že nová proměnná je pouze referencí na původní pole. Pro zkopírování pole můžeš použít kód

poziceElementuR = poziceElementu.slice();
Joker
Profil
Misha:
Umíte mi to někdo vysvětlit?
Ano.
„Problém“ není v metodě reverse, ale v operátoru =.
Totiž přiřazení objektu někam nevytvoří kopii, ale referenci. Tzn. poziceElementuR = poziceElementu; nevytvoří kopii objektu poziceElementu, ale z poziceElementR udělá referenci na poziceElementu, takže ve skutečnosti existuje pořád jen jeden objekt, nad kterým se ty operace dělají.

Je třeba vytvořit kopii pole, poziceElementuR = poziceElementu.slice(0);

Ještě poznamenám, že není dobrý nápad takhle používat globální proměnné, lepší by bylo, aby poziceElementu byla parametr funkce navig.

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