• 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

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
+1 głos
50 wizyt
pytanie zadane 23 listopada w JavaScript przez Nitr0Skay Początkujący (320 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 przez adrian17 Ekspert (323,700 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 przez Nitr0Skay Początkujący (320 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 przez adrian17 Ekspert (323,700 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 przez Comandeer Guru (580,340 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 przez Nitr0Skay Początkujący (320 p.)
edycja 24 listopada 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ź 168 wizyt
pytanie zadane 25 listopada 2018 w Java przez Potopiec Obywatel (1,550 p.)
0 głosów
0 odpowiedzi 244 wizyt
pytanie zadane 10 października 2017 w Sprzęt komputerowy przez Dawidinietylko Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 130 wizyt
pytanie zadane 10 października 2019 w JavaScript przez BlvckFox Gaduła (4,240 p.)

89,760 zapytań

138,364 odpowiedzi

309,425 komentarzy

59,673 pasjonatów

Advent of Code 2022

Top 15 użytkowników

  1. 908p. - Argeento
  2. 877p. - nidomika
  3. 851p. - Michal Drewniak
  4. 848p. - Mikbac
  5. 846p. - rucin93
  6. 838p. - Łukasz Eckert
  7. 835p. - ssynowiec
  8. 822p. - TheLukaszNs
  9. 794p. - JMazurkiewicz
  10. 787p. - Hubert Chęciński
  11. 786p. - adrian17
  12. 775p. - Jarosław Roszyk
  13. 760p. - Mawrok
  14. 756p. - overcq
  15. 752p. - Vinox
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...