1
votes

JavaScript - Erreur de variable déclarée non définie lors de l'exécution de la fonction

J'essaye de créer une calculatrice qui peut dire combien de vendredi 13 il y a dans une année en tapant une année dans une entrée puis en cliquant sur le bouton - une alerte () apparaîtra avec le résultat:

<script>
    function Fridaythe13(j) {
        var count = document.getElementById('year').value;
        var count = 0;
        for (var month=0; month<12; month++) {
            var d = new Date(j,month,13);
            if(d.getDay() == 5){
                count++;
            }
        }
        return count;                            
    }

    document.getElementById("run").addEventListener("click", function(){
        alert(Fridaythe13(count));
    })
</script>

<input type="text" name="year" id="year" />
<section class="material">
    <div class="actions">
        <button type="button" id="run">Run</button>
    </div>
</section>    

Quand je clique sur le bouton, cela dit que la variable count n'est pas définie mais je l'ai déclarée avec l'entrée ('year'), donc je ne comprends pas ... Merci d'avance pour votre aide!


2 commentaires

Vous déclarez count deux fois. Vous devez changer le nom de l'une des variables. Il semblerait que vous souhaitiez renommer le premier en j ...


Veuillez envisager de relire votre code avant de le publier. Et formatez-le correctement.


6 Réponses :


7
votes

Une partie de votre logique était brisée, voici un exemple fonctionnel.

Tout d'abord, vous définissiez la variable count deux fois dans votre fonction.

Aussi, à partir de votre click handler, vous passiez un argument count à votre fonction interne mais cette variable n'a pas non plus été déclarée.

Pensez à utiliser de meilleurs noms pour vos variables. Par exemple year au lieu de j.

Préférez également l'utilisation de let / const à var code> pour déclarer les variables.

function fridayThe13(year) {
    return [...Array(12).keys()] // [0, 1, 2,... 11]
        .map(month => new Date(year, month, 13).getDay() == 5)
        .reduce((accum, val) => accum += val, 0);
}
<input type="text" name="year" id="year" />
<section class="material">
  <div class="actions">
    <button type="button" id="run">Run</button>
  </div>
</section>

Voici un moyen plus court de le faire, en utilisant un style fonctionnel avec une map et reduction pour additionner les valeurs:

function fridayThe13(year) {
    let count = 0;
    for (let month = 0; month < 12; month++) {
      const date = new Date(year, month, 13);
      if (date.getDay() == 5) {
        count++;
      }
    }
    return count;                            
}

document.getElementById("run").addEventListener("click", () => {
  const year = document.getElementById('year').value;
  alert(fridayThe13(year));
})


0 commentaires

0
votes

Le nombre de variables est défini (deux fois comme le fait remarquer @GetOffMyLawn) dans la fonction Fridaythe13 , et l'alerte tente d'y accéder en dehors de cette fonction. Je crois que vous vouliez que votre code ressemble à ceci:

var thisYear = document.getElementById('year').value;

function Fridaythe13(j) {
  var count = 0;
  for (var month = 0; month < 12; month++) {
    var d = new Date(j, month, 13);
    if (d.getDay() == 5) {
      count++;
    }
  }
  return count;
}

document.getElementById("run").addEventListener("click", function() {
  alert(Fridaythe13(thisYear));
})

Mais pour ne pas être confus, je vous recommande de changer la première variable count déclarée en une autre Nom de variable. Peut-être quelque chose comme ceci:

var count = document.getElementById('year').value;

function Fridaythe13(j) {
  var count = 0;
  for (var month = 0; month < 12; month++) {
    var d = new Date(j, month, 13);
    if (d.getDay() == 5) {
      count++;
    }
  }
  return count;
}

document.getElementById("run").addEventListener("click", function() {
    alert(Fridaythe13(count));
})


0 commentaires

0
votes

Votre décompte est déclaré dans la mauvaise fonction ( document.getElementById ('year'). value ). Déplacez-le vers l'autre fonction et cela fonctionnera.

<input type="text" name="year" id="year" />
<section class="material">
  <div class="actions">
    <button type="button" id="run">Run</button>
  </div>
</section>
function Fridaythe13(j) {
  var count = 0;
  for (var month = 0; month < 12; month++) {
    var d = new Date(j, month, 13);
    if (d.getDay() == 5) {
      count++;
    }
  }
  return count;
}

document.getElementById("run").addEventListener("click", function() {
  var count = document.getElementById('year').value;
  alert(Fridaythe13(count));
})


0 commentaires

0
votes

Vous définissez le compte deux fois. Déplacez la première déclaration et renommez-la.

     <script>
     function Fridaythe13(year) {
            var count = 0;
            for (var month=0; month<12; month++) {
                var d = new Date(year,month,13);
                if(d.getDay() == 5){
                  count++;
                }
            }
            return count;                            
        }

        document.getElementById("run").addEventListener("click", function 
        (){
            var selected_year = document.getElementById('year').value;

            alert(Fridaythe13(selected_year));
        })
  </script>


0 commentaires

0
votes

Vous pouvez utiliser la fonction map () pour collecter tous les 13 jours de chaque mois, puis filtrer uniquement pour les vendredis.

const count = [1,2,3,4,5,6,7,8,9,10,11,12]
                   .map(m=>new Date(2019,m,13).getDay())
                   .filter(d=>d==5)
                   .length;
console.log(count);


0 commentaires

0
votes

En reconnaissant que Ven 13 signifie dimanche 1er et en utilisant les décalages annuels et mensuels, il est possible de le faire arithmétiquement sans référence aux objets de date (note: cette version ne fonctionne que sur le calendrier grégorien et les années supérieures à 0) XXX


0 commentaires