Parametr funkcji a nazwa obiektu

0

Witajcie,
w ponizszym kodzie funkcja ma w parametrze car, podczas gdy referencja do obiektu ma nazwe taxi. Jak więc funkcja prequal może odczytać wartości z obiektu taxi skoro nie ma w parametrze taxi a car?


var taxi = {
      mileage: 15000
     ..... };

function prequal (car)  {
   if (car.mileage > 10 000) {
     return false;
    .......
3

nazwa to tylko nazwa, ten sam obiekt może być nazwany taxi i zostać przekazany do funkcji pod nazwą car. To będzie kilka zmiennych (nazw), które będą się odwoływać do tego samego obiektu. Tak jak masz Jarek, Jarosław, Prezes, Kaczor, a jest to jedna osoba.

0

Dzięki,
nie do końca jeszcze rozumiem..
czyli nazwy tu nie są ważne a bardziej wartości -w tym przypadku mileage?
Patrząc na ten kod nie ma czegos takiego jak
car.mileage ale jest za to taxi.mileage

A gdybym miał też mileage w obiekcie 'maluch' to wtedy ta funkcja z parametrem car ktorego obiektu by sie tyczyla?

2

Nazwy są ważne, ale jeśli są używane w tym samym "scopie".

Pozwolę sobie uzupełnić Twój kod troszeszkę:

var taxi = {
      mileage: 15000
};

var taxi2 = {
     mileage: 1000
};
 
function prequal (car)  {
   if (car.mileage > 10000) {
     return false;
   }
   ...

   return true;
}

prequal(taxi); //zwraca false
prequal(taxi2); //zwraca true

Teraz chyba to czytelniej wygląda, nie?

1

Może jak poczytasz czym różni się parametr od argumentu to się coś rozjaśni.

3

Tak, jak pisali koledzy - nazwa zmiennej ma znaczenie wtedy, gdy są one w tym samym zakresie (ang. scope). Aczkolwiek od formalnej strony, to nazwa jest istotna jedynie dla programisty, bo kompilator/interpreter/cokolwiek, co dany kod wykonuje nie operuje nazwami, ale adresami/wskaźnikami na wartości. Nazwy opisowe są stosowane po to, żeby programiście było wygodniej się połapać. Bo jednak bardziej intuicyjne jest odwołanie się do zmiennej iloscSamochodowWleasingu niż $0fac0013 ;)

W rzeczywistości zmienna to taka "szufladka" która przechowuje jakąś wartość, a gdy odwołujesz się w programie do zmiennej, to tak naprawdę wydajesz polecenie w stylu "otwórz szufladkę o nazwie xxx, weź jej zawartość i zrób z nią określone rzeczy" ;) Niektóre języki wymuszają pilnowanie typów, to znaczy że do szufladki przeznaczonej do trzymania liczb nie wsadzisz niczego innego niż liczba, z kolei część języków ma to zupełnie gdzieś i ta sama szufladka może trzymać liczbę, a zaraz potem możesz do niej wsadzić jakiś napis.

Poniżej masz pseudokod, którym postaram się zilustrować temat:

Chory1 = "Nowak";
Chory2 = "Maćkowiak";

function Wylecz(Pacjent) {
alert(Pacjent);
}

Wylecz(Chory1);
Wylecz(Chory2);
}

Wyobraźmy sobie, że jesteśmy u lekarza, a nasze zmienne są pacjentami w poczekalni. Pielęgniarka przychodzi i mówi "Pan Nowak proszę wejść do gabinetu". Nazwisko tak naprawdę ma jedynie na celu wskazanie, o którego pacjenta chodzi (analogicznie do "numeru szufladki" ze zmienną). Od razu widać też, dlaczego nie może być dwóch zmiennych o tej samej nazwie w jednym zakresie. Przecież jakby było dwóch Nowaków w poczekalni, to nie wiedzielibyśmy, który Nowak ma wejść na badanie.

Wywołujemy funkcję Wylecz przekazując jej jako argument nazwisko pacjenta. Następnie ta funkcja rozpoczyna działanie i wykonuje pracę z danym Pacjentem. I teraz ten sam pacjent ma jakby dwie nazwy: "Nowak", czyli nazwisko pod którym jest znany wszędzie indziej, a także "Pacjent" - czyli jego określenie podczas badania. Gdy w gabinecie jest pacjent, lekarz mówiąc do pielęgniarki nie używa formy "proszę podać p. Nowakowi zastrzyk", ale mówi "proszę pacjentowi dać zastrzyk". Ale ponieważ w danej chwili tylko jeden pacjent jest badany, używając nazwy "Pacjent" wszyscy wiedzą, o kogo chodzi. Oczywiście, można podczas badania używać nazwiska (w naszym przykładzie zrobić w funkcji Wylecz coś w stylu alert(Chory1);, ale przez to stracilibyśmy uniwersalność tej funkcji, mogłaby ona jedynie działać na tym konkretnym chorym. A robiąc to w powyższej postaci, możemy do funkcji przesłać dowolnego pacjenta, na którym funkcja będzie mogła działać.

Mam nadzieję, że teraz trochę Ci temat wyjaśniłem. Jeśli nadal czegoś nie łapiesz to śmiało pytaj. W każdym razie ważna rzecz do zapamiętania - nazwa zmiennej to tylko postać opisowa stosowana, żeby ułatwić życie programistom. I nieraz kilka nazw może się odnosić do tego samego obiektu/wartości/szufladki. Wywołując funkcję Wylecz(Chory1); w jej wnętrzu zarówno Chory```` jak i Pacjent``` oznaczają tą samą zmienną.

0

Czyli funkcja tak naprawdę nie wie, że pobrała wartość mileage z obiektu o nazwie 'taxi', czy tak?
Tymczasem jeszcze jedno.. Dlaczego wyświetla się

"Ten SieMoCorp Taxi możesz sobie podarować
Ten Star undefined możesz sobie podarować" // chodzi o tą wyświetlaną wartość

skoro w wywołaniu funkcji prequal przekazuje tylko arguement taxi bez dostawczak?

var taxi = { 
        make: "SieMoCorp",
        model: "Taxi",
        year: 1955,
        color: "żółty",
        passengers: 4,
        convertible: false,
        mileage: 281341
    };

    var dostawczak = {
        make: "Star",
        mileage: 50000
    };
    
    function prequal(car) {
        if (car.mileage > 10000) {
            return false;
        } else if (car.year > 1960) {
            return false;
        }
        return true;
    }
    
    var worthALook = prequal(taxi);  //to wywołanie funkcji
    
    if (worthALook) {
        console.log("Powinieneś zainteresować się tym " + taxi.make + " " + taxi.model);

    } else {
        console.log("Ten " + taxi.make + " " + taxi.model + " możesz sobie podarować");
        console.log("Ten " + dostawczak.make + " " + dostawczak.model + " możesz sobie podarować");
    }

0

No jest undefined, bo dostawczak nie ma zdefiniowanego modelu.

1

Ponieważ jeżeli funkcja "prequal" która dostała jako argument objekt "taxi" zwróci false to ma się wyświetlić (m.in.) to co siedzi w obiekcie "dostawczak" pod nazwami "make" i "model". Nie musisz wcześniej wykonać funkcji na tym obiekcie żeby móc pokazać jego wartości.

Funkcja sprawdziła sobie wartość "mileage" w obiekcie takim jaki podałeś jej za argument nie sprawdziła jej dla żadnego innego obiektu.

2

Może taki zapis byłby trochę jaśniejszy.


let taxi = { 
    make: "SieMoCorp",
    model: "Taxi",
    year: 1955,
    color: "żółty",
    passengers: 4,
    convertible: false,
    mileage: 281341
};


function prequal(cokolwiek) {
if ((cokolwiek.mileage > 10000) || (cokolwiek.year > 1960)) {
    console.log("Ten " + cokolwiek.make + " " + cokolwiek.model + " możesz sobie podarować");
}
else {
    console.log("Powinieneś zainteresować się tym " + cokolwiek.make + " " + cokolwiek.model);
}

}
prequal(taxi);


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