Zmienna wewnątrz funkcji staje się undefined

Zmienna wewnątrz funkcji staje się undefined
Mc_Hammer
  • Rejestracja: dni
  • Ostatnio: dni
0

Cześć,

proszę pomóżcie z kodem poniżej
napisałem to dla pojedynczego, konkretnego checkboxa - odpala prawidłowo
nie rozumiem dlaczego od momentu $a.addEventListener('click', function() { zmienna categories[i] staje się undefined

Kopiuj
window.onload = function() {
  categories = ["category1", "category2", "category3", "category4", "category5"];
  for(i = 0; i < categories.length; i++) {
    var $a = document.getElementById(categories[i]);
    if($a !== null) {
      $a.addEventListener('click', function() {
        console.log("categories: "+ categories[i]);
        $cbs = $('.project-types input[type=checkbox]');
        $cbs.each(function() {
          console.log($(this).attr('class') + " <-> "+ categories[i]);
          if($(this).attr('class') == categories[i])
          {
            $(this).click();
          }
        });
      });
    }
  }
}
SW
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 250
0

W drugiej linijce nie powinno być var categories = ...?

szatkus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 227
1

W momencie, gdy to się wykonuje pętla już jest zakończona i zmienna i ma wartość 5, czyli jest poza tablicą. W takich sytuacjach dobrze jest zrobić dodatkową funkcję.

Kopiuj
window.onload = function() {
  categories = ["category1", "category2", "category3", "category4", "category5"];
  for(const category of categories) {
    var $a = document.getElementById(category);
    if($a !== null) {
      $a.addEventListener('click', function() {
        console.log("categories: "+ category);
        $cbs = $('.project-types input[type=checkbox]');
        $cbs.each(function() {
          console.log($(this).attr('class') + " <-> "+ category);
          if($(this).attr('class') == category)
          {
            $(this).click();
          }
        });
      });
    }
  }
}

Chociaż inny typ pętli for też by chyba zadziałał.

Edit: dobra, nie trzeba funkcji. Nawet zmiana pętli na for(let i = 0; i < categories.length; i++), bo gdy użyjemy let to zmienna istnieje tylko w obrębie bloku.

Edit: zmieniłem na for..of

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.