Autor Zpráva
jirka2
Profil
Ahoj,
mám začátečnický problém, viz tento jednoduchý funkční skript:
function fce() {
    return {z:1};
}

var a = fce();
To se chová dle očekávání, ale tento skript nefunguje:
function fce(x) {
    x = {z:1};
}

var a = {};
fce(a);
Otázka je, proč druhý skript nefunguje a jak to udělat bez použití return.

díky
Kcko
Profil
Protože funkce by měla vždy vracet hodnotu. Půjde to když si proměnnou nadefinuješ jako globální, tj nad kontextem přes var
Nicméně, uniká mi čeho chceš docílit. Vložíš do funkce prázdný objekt a v něm je proměnná x, ve které bude ten objekt který si ve funkci nastavil. Nic se Ti nepřepíše.

O co se snažíš?
jirka2
Profil
Kcko:
Díky za radu, ono je to brutálně zjednodušené. Podstata byla, že jsem po úspěšném volání ajaxu vytvářel objekt (s parametry získanými díky ajaxu). Nakonec jsem využil, že jde toto:
function fce(x) {
    x.b = {z:1};
}
 
var a = {};
fce(a);
A to mi stačí.
Kcko
Profil
takto bys to řešit neměl, měl bys to mít resene v nejakem success callbacku po vykonani ajaxu. Dřív nebo později te to dozene. ať uz v nefunkčnosti nebo neprehlednosti.
Radek9
Profil
jirka2:
Jde v zásadě o to, že ta proměnná x je lokální pro funkci fce. Tím, že do ní uložíš jiný objekt (resp. referenci na ten objekt), nijak neměníš původní objekt, který v ní byl uložený. Jinými slovy jen v proměnné vyměníš jednu referenci za jinou.

Postup, který uvádíš v [#3] je validní. Pokud bys chtěl objekt rošířit o více vlastností najednou, můžeš použít Object.assign:
function fce(x) {
    Object.assign(x, { y: 2, z: 1 });
}
 
var a = { x: 5, z: 0 };
fce(a); // v a je nyní { x: 5, y: 2, z: 1 }

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