Zła konstrukcja funkcji - pytanie początkującego

0

Cze, nie dawno wróciłem sobie popisać coś w JS i natrafiłem na rzecz przy której rozkładałem ręce, otóż ktoś może mi wytłumaczyć, czemu owy kod działa:

function addStrength1(){
        if(char.avaiblePoints > 0){
            char.strength++;
            char.avaiblePoints--;
            document.getElementById("strength").innerHTML = char.strength;
            }
        else{
            return;
        }
    }

a jako, że statystyk jest x, stworzyłem ów funkcje

 function addStat(statDir, id) {
        var text = document.getElementById(id);
        if (char.avaiblePoints > 0){
            statDir++;
            char.avaiblePoints--;
            text.innerHTML = statDir;
            }
        else {
            return;
        }
    }
<!--to potem dodałem-->
    function addStrength(){
        addStat(char.strength, "strength");
    }

Pierwsza funkcja działa poprawnie, ile jest 'avaiblePoints' tyle moge rozwijać daną statystyke, w drugim przypadku zwraca undefined. 'Return' użyłem tu jako nie rób nic, nie wiem czy to dobry.

1
var char = {
    avaiblePoints:1,
    strength: 2,
} 

function addStat(statDir, id) {
        if (char.avaiblePoints > 0){
            statDir++
            char.avaiblePoints--;
            return statDir;
       }
    }
<!--to potem dodałem-->
    function addStrength(){
       return addStat(char.strength, "strength"); //HERE
    }

addStrength()

Jeźeli masz dostęp do char, to tak samo masz dostęp do char.strength, więc dlaczego przekazujesz go w parametrze.

0

Dobre pytanie :). Chciałem dla każdej statystyki żeby była jedna funkcja. Zedytuje wiadomość jak do domu wroce.

1
kakaisback napisał(a):

Dobre pytanie :). Chciałem dla każdej statystyki żeby była jedna funkcja. Zedytuje wiadomość jak do domu wroce.

trochę nie rozumiem co napisałeś.
I pamiętaj też że obiekty są przekazywane przez referencję.

0

Widzisz sam siebie nie czasem nie rozumiem, w pracy byłem i chciałem przesłać swój nowy kod, ale nie polecam pisać na telefonie w notatniku :D

 function addStats(statName){
           if (char.avaiblePoints >0){
               char.statName++;
               char.avaiblePoints--;
               return char.statName;
           }
           else {
               return;
           }
       }

Teraz mam pytanie, jeśli jako parametr w funkcji podam 'statName' i potem będę się chciał odwołać do danej rzeczy we wcześniej zdeklarowanym obiekcie, moge się węwnątrz funkcji odwołać tak 'char.statName'???
Jako, że sobie tam raz na jakiś czas łatwy skrypcik na stronie zrobię, nie wiem czy sie nie myle, ale właśnie pamiętam że kiedy chwile siedziałem w Pythonie i w nim właśnie takie sposób działał kiedy taką wartość podawałem w parametr funkcji i to jest rzecz którą cały czas źle rozumiem, jeszcze jest jedna, ale o nią w innym przypadku spytam :D.

2

Odwoływać się zawsze możesz, dopóki dana zmienna jest w zakresie danego miejsca, jeśli w twoim przypadku jesteś wewnątrz funkcji(lub funkcja wewnątrz funkcji etc.), a obiekt jest na zewnątrz to tak, nie można tylko w odwrtoną stronę, czyli np. obiekt jest zadeklarowany wewnątrz funkcji, a ja się do niego odwołuje z poza tej funkcji.

W poniższym przypadku

let a = { text: 'dsadas' };
let b  = a.text;
b = 'yep'
// a bez zmian

zmienienie zmiennej b nie spowoduje zmiany obiektu 'a' dlatego że pod zmienną jest string (to się tyczy wszystkich typów prostych), zmienne inne niż obiekt są kopiowane.

w tym przypadku:

let a = { text: 'dsadas' };
let b = a
b = false;
// b === false

zmienienie zmiennej b powoduje zmianę zmiennej a, dlatego że zmienna a jest obiektem, to zostanie przekazana referencja, czyli adres w pamięci tej zmiennej.
Co powoduje, że zmieniając zmienną b, zmieniamy zmienną a, ponieważ jest to ta sama zmienna(ten sam adres).

I teraz pytanie jeśli dobrze rozumiem pytanie. Przekazując do funkcji np. 'a.text' przekazujemy nową wartość, utworzoną na podstawie tego co jest w a.text. Więc zmieniając gdzieś w kodzie tej funkcji właśnie tą nowo utworzoną zmienną, nie zmienimy obiektu pierwotnego.

function change(let a) {
   a = 5;
}
const obj = { a: 1 } 
change(obj.a)
console.log(obj);

Jeśli natomiast przekażemy do funkcji cały obiekt, i zmienimy w tej funkcji jakąś zmienna, przez odwołanie się do niej 'a.text' to tak, zostanie ona zmieniona.

1 użytkowników online, w tym zalogowanych: 0, gości: 1