• 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

VPS Starter Arubacloud
+1 głos
101 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,100 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,100 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 (599,730 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ź 305 wizyt
pytanie zadane 25 listopada 2018 w Java przez Potopiec Obywatel (1,550 p.)
0 głosów
0 odpowiedzi 277 wizyt
pytanie zadane 10 października 2017 w Sprzęt komputerowy przez Dawidinietylko Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 281 wizyt
pytanie zadane 10 października 2019 w JavaScript przez BlvckFox Gaduła (4,240 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...