Autor Zpráva
Honza_n
Profil *
Chci se zeptat jak v JS funguje odkazování na vnější proměnnou. pokud nechci aby funkce vytvořila kopii proměnné ale pracovala s odkazem?

V PHP je něco takového
function filter(&$zkratka, &$end1, &$end2){
}

V JS toto nefunguje
function filter(&zkratka, &end1, &end2){
}
_es
Profil
Honza_n:
Nerozumiem celkom otázke.
Funkcia v JS môže pristupovať ku globálnym premenným, na rozdiel od PHP, priamo, bez nejakých špeciálnych príkazov, netreba ani nič dávať do argumentu funkcie.
Argumenty sa do funkcií v JS predávajú vždy hodnotou, no pri odkazových dátových typoch je tou hodnotou (odkaz na) objekt.
Honza_n
Profil *
Jde mi jen o to jestli se ta proměnná kopíruje nebo se pracuje s odkazem. V php je to tak, že když se tam nedá & tak se vytvoří kopie původní proměnné
Nox
Profil
objekt se předává odkazem, skalár teda asi ne... pokud stačí objekt, je vyřešeno, pokud je třeba ostatní, tak zatím nevim
_es
Profil
Honza_n:
Chci se zeptat jak v JS funguje odkazování na vnější proměnnou. pokud nechci aby funkce vytvořila kopii proměnné ale pracovala s odkazem?
Takže znovu, načo chceš vlastne dávať odkaz na globálnu premennú do argumentu funkcie, keď s tou premennou môžeš pracovať priamo?
var x = 10;
function f(){
  alert(x); // 10
  x = 20;
}
f();
alert(x); // 20

Nox:
objekt se předává odkazem
V JS sa argumenty všetkých dátových typov pri volaní funkcie predávajú vždy hodnotou, nikdy nie odkazom.
Honza_n
Profil *
Asi jsem to řekl špatně. Tak ta proměnná nebyla vnější (globální), ale uvnitř funkce, ze které jsem volal jinou funkci.

Asi ta otázka byla zbytečná, protože ty proměnné co tam předávám nejsou objekt, a to s čím tam dále pracuji - s objekty - tak ty jsou deklarovány globálně.
_es
Profil
Honza_n:
Aby to nebolo pochopené nesprávne:
Premenné sa pri volaní funkcie predávajú hodnotou, no pri premenných obsahujúcich objekty - odkazové typy, je tou hodnotou odkaz na ten objekt.
No nejedná sa o predávanie odkazom, lebo sa nepredáva odkaz na tú premennú, ale až odkaz na objekt, na ktorý odkazuje tá premenná.
Nox
Profil
aha, to jsem si asi špatně vyložil
"Objects are passed around by reference. They are never copied"
Honza_n
Profil *
Nox:
"Objects are passed around by reference. They are never copied"
OK tak to je dostatečně jasné
Nox
Profil
Honza_n:
No, asi ne když to podle _es takto u funkcí neplatí

Na druhou stranu ... předával jsem funkci pole (což je v JS objekt) a skutečně to ovlivňovalo původní, takže jsem ho musel pomocí .slice() zkopírovat
_es:
opravdu se předávají objekty hodnotou?
_es
Profil
Nox:
opravdu se předávají objekty hodnotou?
Asi som nebol úplne pochopený:
Ak je v premennej x objekt a je takto predaný do funkcie f ako argument:
f(x);
tak ten objekt je predaný odkazom, teda nenastáva kopírovanie objektu, no premenná x je predaná hodnotou.
Vo funkcii f môže byť ten istý objekt zmenený, no nedá sa v tej funkcii cez prístup k tomu argumentu spraviť, aby premenná x odkazovala na iný objekt.
Okrem premennej x je v tomto prípade vytvorená aj nejaká lokálna premenná funkcie f, ktorá bude odkazovať na ten istý objekt:
var x = {v:1};
function f(p){ p = {v:2}; }
f(x);
alert(x.v); // 1
var x = {v:1};
function f(p){ p.v = 2; }
f(x);
alert(x.v); // 2
Nox
Profil
Aha, díky za vysvětlení

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