• 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

Object Storage Arubacloud
0 głosów
254 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,190 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,190 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,190 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 (601,110 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 127 wizyt
0 głosów
1 odpowiedź 159 wizyt
0 głosów
1 odpowiedź 320 wizyt

92,568 zapytań

141,420 odpowiedzi

319,620 komentarzy

61,954 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...