Autor | Zpráva | ||
---|---|---|---|
Honza_n Profil * |
#1 · Zasláno: 8. 7. 2010, 18:49:45
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 |
#2 · Zasláno: 8. 7. 2010, 19:21:31
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 * |
#3 · Zasláno: 8. 7. 2010, 19:36:27
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 |
#4 · Zasláno: 8. 7. 2010, 19:42:01
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 |
#5 · Zasláno: 8. 7. 2010, 20:09:17 · Upravil/a: _es
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 * |
#6 · Zasláno: 8. 7. 2010, 20:28:34
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 |
#7 · Zasláno: 8. 7. 2010, 20:32:38 · Upravil/a: _es
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 |
#8 · Zasláno: 8. 7. 2010, 20:44:46
aha, to jsem si asi špatně vyložil
"Objects are passed around by reference. They are never copied" |
||
Honza_n Profil * |
#9 · Zasláno: 8. 7. 2010, 21:32:54
Nox:
"Objects are passed around by reference. They are never copied" OK tak to je dostatečně jasné |
||
Nox Profil |
#10 · Zasláno: 9. 7. 2010, 11:17:32 · Upravil/a: Nox
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 |
#11 · Zasláno: 9. 7. 2010, 11:34:27 · Upravil/a: _es
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); 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 |
#12 · Zasláno: 9. 7. 2010, 12:43:34
Aha, díky za vysvětlení
|
||
Časová prodleva: 14 let
|
0