• 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
139 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 (349,240 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 (349,240 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 (604,780 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ź 393 wizyt
pytanie zadane 25 listopada 2018 w Java przez Potopiec Obywatel (1,550 p.)
0 głosów
0 odpowiedzi 284 wizyt
pytanie zadane 10 października 2017 w Sprzęt komputerowy przez Dawidinietylko Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 391 wizyt
pytanie zadane 10 października 2019 w JavaScript przez BlvckFox Gaduła (4,240 p.)

92,977 zapytań

141,939 odpowiedzi

321,182 komentarzy

62,303 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...