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

Niewłaściwe działanie transpilatora

42 Warsaw Coding Academy
0 głosów
215 wizyt
pytanie zadane 30 sierpnia 2020 w JavaScript przez maslokeeper01 Użytkownik (620 p.)

Witam,

W skrypcie mam następującą pętlę:
 

function resetCats(){
let images = document.querySelectorAll('.cats');
let size = images.length;
for (i=0; i<size; i++)
    images[i].remove();
}

Z użyciem Babela transpiluję kod z @babel/preset-env, czyli transpilator powinien np. dodać słowo kluczowe var przed zmienną i będącą iteratorem pętli. Po wykonaniu skryptu Babela pętla w pliku źródłowym wygląda następująco:

function resetCats() {
  var images = document.querySelectorAll('.cats');
  var size = images.length;

  for (i = 0; i < size; i++) {
    images[i].remove();
  }

Jak widać, zmienna i pozostaje bez słowa kluczowego, przez co skrypt odpalony w strict mode program wyrzuca error.

Dlaczego użycie transpilatora nie skutkuje dopisaniem słowa kluczowego var, jak powinno być w tym przypadku?

Załączam plik konfiguracyjny babel.config.json:
 

{
    "presets": ["@babel/preset-env"],
    "plugins": []
}

 

komentarz 30 sierpnia 2020 przez ScriptyChris Mędrzec (190,190 p.)

Swoją drogą, dlaczego sam nie zadeklarowałeś zmiennej i przez var lub let? Gdybyś użył lintera, to powinien krzyczeć, że masz niezadeklarowaną zmienną (lub implicit global) w nagłówku pętli - możesz go skonfigurować żeby sprawdził pliki projektu zanim proces budowania się rozpocznie.

2 odpowiedzi

0 głosów
odpowiedź 30 sierpnia 2020 przez niezalogowany

> Dlaczego użycie transpilatora nie skutkuje dopisaniem słowa kluczowego var?

Nie wiem, ale proponuję dopisać w Twoim kodzie:

for (let i=0; i<size; i++)

Powinno rozwiązać problem z brakiem var

komentarz 30 sierpnia 2020 przez maslokeeper01 Użytkownik (620 p.)
Wiem, ale transpilator ma działać w taki sposób, że rzeczy nieprzechodzące przez interpreter przeglądarki (głównie rzeczy ze standardu ES2015+) kompiluje w taki sposób, żeby przeglądarka je rozumiała. Chrome nie ma problemu z brakiem var, IE już może, a Babel jest po to, żeby takich mankamentów nie musieć pilnować samemu.
komentarz 30 sierpnia 2020 przez niezalogowany
Wszystko działa wszystko poprawnie.

Stworzyłeś zmienną globalną i oczekujesz że transpilator zamieni ją na zmienną o zasięgu funkcyjnym. Czemu miałby to zrobić?
0 głosów
odpowiedź 30 sierpnia 2020 przez Artek Stary wyjadacz (11,800 p.)
Podejrzewam, że skoro sam nie użyłeś ani var ani let to po prostu nie dodał. W sumie dlaczego miałby dodawać? Przecież nie każda zmienna używana wewnątrz funkcji musi być w niej zadeklarowana. Może pochodzić z zakresu nadrzędnego.

Podobne pytania

0 głosów
0 odpowiedzi 189 wizyt
pytanie zadane 17 lipca 2020 w JavaScript przez creend Gaduła (4,700 p.)
0 głosów
1 odpowiedź 185 wizyt
pytanie zadane 28 lipca 2022 w JavaScript przez KubaLaska Początkujący (350 p.)
0 głosów
2 odpowiedzi 349 wizyt
pytanie zadane 11 marca 2020 w JavaScript przez PoProstuTomasz Początkujący (470 p.)

93,382 zapytań

142,382 odpowiedzi

322,540 komentarzy

62,738 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...