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

Pętla for..in przestała działać po próbie modularyzacji

Object Storage Arubacloud
+1 głos
103 wizyt
pytanie zadane 23 listopada 2022 w JavaScript przez Nitr0Skay Użytkownik (670 p.)

Witam. Otóż próbowałem dzisiaj podzielić swój kod na odrębne moduły (przy pomocy ES6 Modules) i natrafiłem na dość dziwny i nietypowy problem. Mianowicie chodzi o ten kawałem kodu:
 

Bot.prototype.createHelpList = async function(parentElement) {

  let helpContent = await fetch(`./assets/helpContent.json`);
      helpContent = await helpContent.json();
  const contentList = document.createElement(`dl`);
        contentList.setAttribute(`id`, `helpList`);
        contentList.setAttribute(`class`, `helpList`);
  console.log(helpContent);   // By sprawdzić w konsoli, czy treść z pliku JSON została załadowana  - jak widać, została
    for (term in helpContent) { ...

 

Standardowo kod ten działał bez zarzutu gdy zaciągałem kilka skryptów po kolei w [tt]index.html[/tt]
Jednak po modularyzacji, w konsoli pojawił się Reference Error z jakiegoś nieznanego mi powodu.

I tak zasadniczo nie wiem, o co chodzi. Struktura plików się nie zmieniła jak coś.

Jeżeli brakuje jakiś informacji które pomogą rozwiązać problem, lub podsunąć rozwiązanie to proszę pytać. Bo w sumie to sam nie wiem, co tu się zadziało - obiekt jest, lecz nie można po nim iterować. Jakieś pomysły, 

3 odpowiedzi

+2 głosów
odpowiedź 23 listopada 2022 przez adrian17 Ekspert (344,860 p.)

Moduły domyślnie działają w strict mode - co oznacza między innymi, że nie możesz używać niezadeklarowanych zmiennych.

Tak więc powinno być:

for (let a in b) {...}
for (let a of b) {...}
// ofc zamiast let może być const/var

A tak na boku:

contentList.setAttribute(`id`, `helpList`);
// powinno być po prostu
contentList.id = "helpList";

 

komentarz 24 listopada 2022 przez Nitr0Skay Użytkownik (670 p.)

contentList.setAttribute(`id`, `helpList`);
// powinno być po prostu
contentList.id = "helpList";
 

 

Oczywiście rozważałem i to rozwiązanie i pewnie bym to zastosował, gdyby nie fakt, że zaraz za tym idę za ciosem i w taki sam sposób ustawiłem sobie nazwę klasy dla tegoż oto elementu. Dzięki temu też nieco dostosowałem wcięcia, przez co ten kawałek kodu wygląda nieco lepiej, niż to:

const contentList = document.createElement(`dl`);
      contentList.id = `helpList`;
      contentList.className = `helpList`;

lub to

const contentList = document.createElement(`dl`);
   contentList.id = `helpList`;

Także było to z mojej strony zamierzone działanie estetyczne ;p

Oczywiście doceniam Pana sugestię i dziękuje bardzo.
Życzę miłego wieczoru :)

komentarz 24 listopada 2022 przez adrian17 Ekspert (344,860 p.)

że zaraz za tym idę za ciosem i w taki sam sposób ustawiłem sobie nazwę klasy dla tegoż oto elementu

Jak najbardziej, `el.className` zamiast setAttribute.

Natomiast

Także było to z mojej strony zamierzone działanie estetyczne ;p

Ehhh praktycznie każdy programista i każde narzędzie do formatowania kodu pod słońcem na to spojrzy i natychmiast powie "wyrzuć te wcięcia, pisz jak człowiek" :P

const contentList = document.createElement(`dl`);
contentList.id = "helpList";
contentList.className = "helpList";

 

+1 głos
odpowiedź 23 listopada 2022 przez Comandeer Guru (600,390 p.)

Bo term nie jest deklarowane, a moduły są zawsze w trybie ścisłym (kod poza modułami domyślnie w nim nie jest). A w trybie ścisłym wszystkie zmienne muszą być zadeklarowane. Wystarczy dodać zatem słowo kluczowe przed term w pętli:

for ( const term in helpContent ) {

 

0 głosów
odpowiedź 24 listopada 2022 przez Nitr0Skay Użytkownik (670 p.)
edycja 24 listopada 2022 przez Nitr0Skay
No tak.....  strict mode i brak deklaracji zmiennej tworzonej w pętli to te dwa brakujące puzle układanki. Wiedziałem, że coś przeoczyłem xD

Dziękuję Wam, panowie. Dostosowałem się do wskazówek i działa. Mogę wracać do pracy ;p

Podobne pytania

0 głosów
1 odpowiedź 306 wizyt
pytanie zadane 25 listopada 2018 w Java przez Potopiec Obywatel (1,550 p.)
0 głosów
0 odpowiedzi 278 wizyt
pytanie zadane 10 października 2017 w Sprzęt komputerowy przez Dawidinietylko Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 293 wizyt
pytanie zadane 10 października 2019 w JavaScript przez BlvckFox Gaduła (4,240 p.)

92,536 zapytań

141,377 odpowiedzi

319,454 komentarzy

61,922 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!

...