• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

JS - program nie znajduje obiektów z innych funkcji

0 głosów
527 wizyt
pytanie zadane 14 grudnia 2020 w JavaScript przez aguro_ Początkujący (270 p.)

Dzień dobry! Dopiero zaczynam z JS, rozwiązuję proste zadania i niestety czasami nie widzę podstawowych pomyłek. 1. Tworzę funkcje, która wyświetli aktualną datę w żądanym formacie - to działa! 

    function currentDate() {

                var today = new Date().toLocaleDateString('pl-PL', {
                    day : 'numeric',
                    month : 'numeric',
                    year : 'numeric',
                    hour: '2-digit',
                    minute: '2-digit',
                    second: '2-digit'
                });
                return today;
            }

            console.log(currentDate());

2. Następnie potrzebuję stworzyć funkcję, która wyświetli nową datę po odjęciu lub dodaniu dni. To działa połowicznie... powstaje mi nowa data, ale tylko jeżeli dodaje do funkcji var today = new Date(); (czyli proszę o wyświetlenie dzisiejszej daty na nowo...). Chciałabym aby dzisiejsza data była zaciągana z tej pierwszej funkcji.

function newDate(){

                var today = new Date();

                var n = new Date();
                    n.setYear(today.getFullYear());
                    n.setMonth(today.getMonth());
                    n.setDate(today.getDate() + LD[0]);
                    n.setHours(today.getHours());
                    n.setMinutes(today.getMinutes());
                    n.setSeconds(today.getSeconds());

                var nday = n.toLocaleDateString('pl-PL', {
                    day : 'numeric',
                    month : 'numeric',
                    year : 'numeric',
                    hour: '2-digit',
                    minute: '2-digit',
                    second: '2-digit'
                });
                return nday;

            }

            LD = [-80]; //liczba dni do zmiany  

            console.log(newDate());

3. Na końcu potrzebuję wskazać różnicę pomiędzy obydwoma datami. I tutaj znowu pojawia się problem. Nie wiem jak pobrać argumenty z poprzednich funkcji tak jak w zadaniu powyżej. Tzn. wydaje mi się, że sposób jest właściwy, ale nie rozumiem, dlaczego nie pobiera... Kiedy w trzecim przykładzie przekopiowałam wszystkie dane do jednej funkcji consola pokazywała mi liczbę dni. 

  function difference(){
                var diff = currentDate().getDate() - newDate().getDate();
                return diff;
            }
            console.log(difference());

A w tym przypadku pojawia się komunikat: Uncaught TypeError: currentDate(...).getDate is not a function. Domyślam się, że w trzecim zadaniu będę musiała jeszcze zrobić pętlę aby sprawdzać, która data jest większa i ładnie to wyświetlać, ale na razie utkwiłam na tym etapie... :(

Będę bardzo wdzięczna za pomoc!

2 odpowiedzi

0 głosów
odpowiedź 14 grudnia 2020 przez ScriptyChris Mędrzec (190,170 p.)
wybrane 15 grudnia 2020 przez aguro_
 
Najlepsza

1. Tworzę funkcje, która wyświetli aktualną datę w żądanym formacie - to działa! 

Działa, ale zwracasz z tej funkcji string, a nie obiekt daty (stąd dalsze problemy). Spróbuj zwrócić jednocześnie obiekt daty i jej sformatowaną, tekstową reprezentację:

function currentDate() {
 
            var today = new Date();
            
            var formattedDateTime = today.toLocaleDateString('pl-PL', {
                day : 'numeric',
                month : 'numeric',
                year : 'numeric',
                hour: '2-digit',
                minute: '2-digit',
                second: '2-digit'
            });

            return {
               date: today,
               formattedDateTime
            }
        }
 
        console.log(currentDate());

Chciałabym aby dzisiejsza data była zaciągana z tej pierwszej funkcji. 

Masz na myśli funkcję currentDate()?

3. Na końcu potrzebuję wskazać różnicę pomiędzy obydwoma datami. I tutaj znowu pojawia się problem. Nie wiem jak pobrać argumenty z poprzednich funkcji tak jak w zadaniu powyżej.

Tutaj jest analogiczny problem jak z funkcją currentDate(). Zmienna nday zawiera sformatowany tekst daty, a nie obiekt (na którym są dostępne jej metody, m.in. getDate()). Zmień to wg wskazówek z pierwszego punktu.

A w tym przypadku pojawia się komunikat: Uncaught TypeError: currentDate(...).getDate is not a function.

Metoda .toLocaleDateString() zwraca string (który przypisujesz do zmiennej today), a nie obiekt daty, a Twoja funkcja currentDate() zwraca właśnie string (zamiast obiektu). Żeby metoda .getDate() zadziałała, powinnaś zwrócić obiekt daty - opisałem to w pierwszym punkcie.

komentarz 14 grudnia 2020 przez aguro_ Początkujący (270 p.)

Bardzo dziękuję za odpowiedź i wyjaśnienia, postarałam się wprowadzić zmiany, ale nadal pojawia się problem...

function currentDate() {

                var today = new Date();
                
                var tFormattedDateTime = today.toLocaleDateString('pl-PL', {
                    day : 'numeric',
                    month : 'numeric',
                    year : 'numeric',
                    hour: '2-digit',
                    minute: '2-digit',
                    second: '2-digit'
                });
                return {
                    date: today,
                    tFormattedDateTime
                }
            }

            console.log(currentDate());

            // Ćwiczenie 2
            
            function newDate(){

                //var today = new Date();

                var nday = new Date();
                    nday.setYear(currentDate(today).getFullYear());
                    nday.setMonth(currentDate(today).getMonth());
                    ndayn.setDate(currentDate(today).getDate() + LD[0]);
                    nday.setHours(currentDate(today).getHours());
                    nday.setMinutes(currentDate(today).getMinutes());
                    nday.setSeconds(currentDate(today).getSeconds());

                var nFormattedDateTime = nday.toLocaleDateString('pl-PL', {
                    day : 'numeric',
                    month : 'numeric',
                    year : 'numeric',
                    hour: '2-digit',
                    minute: '2-digit',
                    second: '2-digit'
                });
                return {
                    date: nday,
                    nFormattedDateTime
                }

            }

            LD = [-80]; //liczba dni do zmiany  

            console.log(newDate());

            // Ćwiczenie 3:

            function difference(){

                var diff = currentDate(today).getDate() - newDate(nday).getDate();
                return diff;
            }
            console.log(difference());

Błąd: Uncaught ReferenceError: today is not defined - odnośni się do funkcji currentDate:

nday.setYear(currentDate(today).getFullYear()) - itd.

 

Chciałabym aby dzisiejsza data była zaciągana z tej pierwszej funkcji. 

Masz na myśli funkcję currentDate()?

 

Dokładnie tak, kiedy zaargumentowałam //var today = new Date(); - newDate nie odnosi się już do today. Nawet po wprowadzeniu zmian...

komentarz 15 grudnia 2020 przez ScriptyChris Mędrzec (190,170 p.)

Błąd: Uncaught ReferenceError: today is not defined - odnośni się do funkcji currentDate:

W którym miejscu ten błąd występuje? W funkcji currentDate? Możesz pokazać cały log błędu z konsoli (wraz ze wskazaniem na lokalizację błędu)?

Dokładnie tak, kiedy zaargumentowałam //var today = new Date(); - newDate nie odnosi się już do today.

O którym miejscu kodu teraz mówisz? @Comandeer odpowiedział Ci, jak wywołać funkcje z parametrami.

komentarz 15 grudnia 2020 przez aguro_ Początkujący (270 p.)

 

Błąd: Uncaught ReferenceError: today is not defined - odnośni się do funkcji currentDate:

W którym miejscu ten błąd występuje? W funkcji currentDate? Możesz pokazać cały log błędu z konsoli (wraz ze wskazaniem na lokalizację błędu)?

Błąd: Uncaught ReferenceError: today is not defined nawiązuje dokładnie do tego miejsca w miejsca kodzie (nie, nie - to w funkcji newDate):

                    nday.setYear(currentDate(today).getFullYear());
                    nday.setMonth(currentDate(today).getMonth());
                    ndayn.setDate(currentDate(today).getDate() + LD[0]);
                    nday.setHours(currentDate(today).getHours());
                    nday.setMinutes(currentDate(today).getMinutes());
                    nday.setSeconds(currentDate(today).getSeconds());

Być może nie do końca rozumiem podpowiedź @Comandeer, kiedy dodaje ten element kodu do funkcji newDate() pojawia mi się z kolei komunikat: Uncaught TypeError: currentDate is not a function. 

            // Ćwiczenie 1:
            function currentDate() {

                var today = new Date();
                
                var tformattedDateTime = today.toLocaleDateString('pl-PL', {
                    day : 'numeric',
                    month : 'numeric',
                    year : 'numeric',
                    hour: '2-digit',
                    minute: '2-digit',
                    second: '2-digit'
                });
                return {
                    date: today,
                    tformattedDateTime
                }
            }
            console.log(currentDate());

            // Ćwiczenie 2
            function newDate(){

                //var today = new Date(); 
                //var currentDate = currentDate();               

                var nday = new Date();
                    nday.setYear(currentDate(today).getFullYear());
                    nday.setMonth(currentDate(today).getMonth());
                    ndayn.setDate(currentDate(today).getDate() + LD[0]);
                    nday.setHours(currentDate(today).getHours());
                    nday.setMinutes(currentDate(today).getMinutes());
                    nday.setSeconds(currentDate(today).getSeconds());

                var nformattedDateTime = nday.toLocaleDateString('pl-PL', {
                    day : 'numeric',
                    month : 'numeric',
                    year : 'numeric',
                    hour: '2-digit',
                    minute: '2-digit',
                    second: '2-digit'
                });
                return {
                    date: nday,
                    nformattedDateTime
                }
            }
            LD = [-80]; //liczba dni do zmiany  
            console.log(newDate());

            // Ćwiczenie 3:
            function difference(){

                var currentDate = currentDate(),
                    newDate = newDate(),
                    difference = difference( currentDate, newDate );

                var diff = currentDate(today).getDate() - newDate(nday).getDate();
                return diff;
            }
            console.log(difference());

 

 

 

komentarz 15 grudnia 2020 przez ScriptyChris Mędrzec (190,170 p.)
edycja 15 grudnia 2020 przez ScriptyChris

W funkcji newDate próbujesz wywołać funkcję currentDate z przekazaniem zmiennej today, ale w funkcji newDate nie ma tej zmiennej - jest dopiero zwrócona w obiekcie z funkcji currentDate. Jeśli chcesz coś przekazać do funkcji z zewnątrz, to (w najprostszym przypadku):

  1. funkcja musi mieć zdefiniowane argumenty w nagłówku,
  2. musisz wywołać funkcję z parametrami odpowiadającymi argumentom w nagłówku

Przeanalizuj poniższy prosty przykład wywołania funkcji z parametrami i utworzenia funkcji z nagłówkiem przyjmującym argumenty, a następnie spróbuj go analogicznie zastosować u siebie:

function funkcja(argument1, argument2) { // funkcja przyjmuje argumenty
  console.log(         /|\        /|\
    argument1,          |          |
    argument2,          |          |
  ); // hello world     |          |
}                       |          |
                        |          |
var param1 = 'hello';   |          |
var param2 = 'world';   |          |
                        |          |
              funkcja(param1, param2); //wywołaj funkcję z parametrami

Istotna jest kolejność przekazania, żeby określony parametr był w tym samym miejscu, co odpowiadający mu argument w nagłówku funkcji. Nazwy dla "par" argument <-> parametr mogą być takie same, ale nie muszą.

1
komentarz 15 grudnia 2020 przez aguro_ Początkujący (270 p.)

@ScriptyChris@Comandeer - bardzo, bardzo dziękuję za szczegółowe wyjaśnienia! Działa jak należy :))

0 głosów
odpowiedź 14 grudnia 2020 przez Comandeer Guru (607,960 p.)

Zacznę od końca – z funkcji currentDate nie zwracasz daty, ale stringa z ładnie sformatowaną datą. Z tego też powodu nie da się tego wyniku użyć jako daty w funkcji difference.

Natomiast jeśli chodzi o przekazywanie danych między funkcjami: najlepiej to zrobić przy pomocy parametrów:

var currentDate = currentDate(),
	newDate = newDate(),
	difference = difference( currentDate, newDate );

 

Podobne pytania

0 głosów
3 odpowiedzi 380 wizyt
0 głosów
1 odpowiedź 322 wizyt
0 głosów
1 odpowiedź 468 wizyt

93,720 zapytań

142,641 odpowiedzi

323,265 komentarzy

63,269 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...