Autor | Zpráva | ||
---|---|---|---|
robbie Profil * |
#1 · Zasláno: 1. 8. 2014, 13:37:40 · Upravil/a: robbie
function setName(obj) { obj.name = “Nicholas”; obj = new Object(); obj.name = “Greg”; } var person = new Object(); setName(person); alert(person.name); Moc nechápu, co tím autor chtěl říct: When person is passed into setName(), its name property is set to “Nicholas”. Then the variable obj is set to be a new object and its name property is set to “Greg”. If person were passed by reference, then person would automatically be changed to point to the object whose name is “Greg”. However, when person.name is accessed again, its value is “Nicholas”, indicating that the original reference remained intact even though the argument’s value changed inside the function. When obj is overwritten inside the function, it becomes a pointer to a local object. That local object is destroyed as soon as the function fi nishes executing. Moc nechápu druhou polovinu odstavce, jak zde příší, že pokud se na person.name přijde znovu, jeho hodnota je opět "Nicholas" značící, že originál odkaz zustal nedotčen. A další vec, co znamená: argument passed by reference a argument passed by value, jak si to mám predstavit? Děkuji moc za vysvetlení |
||
juriad Profil |
Máš trochu znalosti jazyka C++? Pokud ne, tak to raději ani nečti.
Toto jsou tři různé způsoby, práce s objektem Person (podle počtu hvězdiček - hloubky odkazování v argumentu funkce) Rychlokurz: hvězdička v argumentu značí odkaz; hvězdička u proměnné značí použítí (aplikaci) odkazu; ampersant značí získání odkazu. Přímovoid setName(Person p) { /* předá se kopie, jakákoli změna se venku neprojeví */ p.name = "Nicholas"; new (&p) Person(); p.name = "Greg"; } Person q; // mám přímo objekt setName(q); // předá se jako kopie q.name == NULL /* změny se prováděly s kopií */ // nebo také: Person *q = new Person(); // mám jen odkaz na objekt setName(*q); // předá se aplikovaný odkaz = přímo objekt => kopie (*q).name == NULL Odkazemvoid setName(Person *p) { /* předá odkaz na objekt; změní jméno a do stejné lokální proměnné vytvoří nového člověka */ (*p).name = "Nicholas"; p = new Person(); // p je lokální proměnná (*p).name = "Greg"; } Person q; // mám přímo objekt setName(&q); // předá se odkaz na objekt q.name == "Nicholas" // jde o stejného přejmenovaného člověka // to samé také: /* Toto je k systému objektů v JS nejblíže, nikdy nedržíš přímo objekt, ale odkaz na objekt */ Person *p = new Person(); // mám jen odkaz na objekt setName(p); // předá se ten odkaz (*p).name == "Nicholas" Odkazem na odkazvoid setName(Person **p) { /* předá odkaz na odkaz na objekt; změní jméno a pak toho člověka vymění za nově narozeného */ (**p).name = "Nicholas"; *p = new Person(); // (*p) není lokální proměnná - odpovídá a je to ta proměnná q (**p).name = "Greg"; } Person *q = new Person(); // mám jen odkaz na objekt setName(&q); // předám odkaz na proměnnou q = odkaz na odkaz na objekt => můžu změnit ve funkci obsah q = změním na odkaz na jiný objekt (*q).name == "Greg" // jde o nového člověka |
||
_es Profil |
#3 · Zasláno: 1. 8. 2014, 16:08:08
robbie [#1]:
Možno to bola ukážka toho, že argumenty sa do funkcie predávajú vždy hodnotou. Spomenul som si na toto vlákno: dotaz na argument funkce. |
||
Časová prodleva: 4 dny
|
|||
fireball_ Profil |
Autor ti chtěl tím kódem ukázat, že proměnná person je referenční ( odkazová ). Což zjedodušeně znamená, že je to ukazatel na místo kde je uložená v paměti. Do funkce si tedy předáš jen tu referenci a měníš objekt v paměti. Zjistíš to samozřejmě jen pokud s ním dál pracuješ - zde alert.
Následuje vytvoření nového objektu. Reference se uloží do lokální proměnné obj, která je definovaná argumentem funkce. Referenci, ale na tento objekt ztratíš po vykonání funkce, protože si ji nikde neuchováš. Uchování by pak mohlo být třeba pomocí globálního objektu nebo třeba nějaký return do proměnné. Javascript je jedna velká záhada. Chápeš ten mechanismus podle toho popisu? |
||
juriad Profil |
robbie:
Asi jsi zvyklý, že: function f(i) { i++; } var a = 0; f(a); alert(a); // bude 0 Jde tedy o první případ, který jsem zmínil v [#2]. Na druhou stranu, asi bys čekal toto: function f(arr) { arr.push("x"); } var a = []; f(a); alert(a.length); // bude 1 Jde tedy o druhý případ, který jsem zmínil v [#2]. JavaScript neumožňuje třetí případ, který jsem zmínil v [#3], na to nemá dostatečné jazykové prostředky. Víceméně jde jen o to, že argumenty různých typů se chovají různě. Existují ale jen dva možné scénáře: 1) předávání hodnotou - vytvoří se kopie - tak se předávají ta čísla. 2) předávání referencí (odkazem) - nevzniká kopie - pracuje se přímo s tou věcí - tak se předávají pole. A na tobě je, aby sis našel (nebo vyzkoušel), jak se který typ předává. |
||
Časová prodleva: 10 let
|
0