J'ai donc créé cette page HTML avec du JavaScript. Et j'ai ce bouton qui génère un emojis sur six. Cela a bien fonctionné, puis j'ai ajouté du code pour empêcher le programme de sortir le même emoji deux fois de suite, mais cela ne fait aucune différence et je ne sais pas pourquoi.
Voici mon code:
function randEmoji()
{
var oldEmoji = emoji;
var emojiList = [";)", ":D", "xD", ":O", ":X", ":P"];
var emoji = emojiList[Math.floor(Math.random() * emojiList.length)];
if (oldEmoji == emoji)
{
randEmoji();
}
else
{
document.getElementById("emojiText").innerHTML = "Look how fun! ---> " + emoji + " <--- An emoji!";
console.log(emoji);
}
}
Je ne suis pas très doué en programmation et je n'ai aucune idée de la cause de ce problème.
S'il vous plaît, aidez-moi!
3 Réponses :
vous devez déclarer vos variables en dehors de la fonction et les définir à l'intérieur. sinon, leurs valeurs sont réinitialisées à chaque appel de fonction.
Essayez ceci:
var oldEmoji = '';
var emoji = '';
var emojiList = [";)", ":D", "xD", ":O", ":X", ":P"];
function randEmoji() {
oldEmoji = emoji;
emoji = emojiList[Math.floor(Math.random() * emojiList.length)];
if (oldEmoji == emoji) {
randEmoji();
} else {
console.log(emoji);
}
}
var i = 0;
while (i < 20) {
randEmoji();
i += 1;
}
Le problème est que toutes les variables locales à la portée de la fonction (c'est-à-dire déclarées à l'intérieur de la fonction) sont jetées une fois que la fonction a terminé son exécution. Ainsi, chaque fois que vous exécutez la fonction emoji et oldEmoji sont rétablis à partir de non défini
Une solution serait de déplacer l'une de ces déclarations une portée parent, comme ceci:
var oldEmoji;
function randEmoji() {
var emojiList = [";)", ":D"];
var emoji = emojiList[Math.floor(Math.random() * emojiList.length)];
if (oldEmoji == emoji) {
randEmoji();
} else {
console.log(emoji);
oldEmoji = emoji;
}
}
randEmoji();
randEmoji();
randEmoji();
randEmoji();
randEmoji();
randEmoji();
randEmoji();
Voyez ici, nous n'obtenons jamais de répétition.
En plus de @ full-stack answer, vous pouvez:
var oldEmoji = '';
var emoji = '';
var emojiList = [";)", ":D", "xD", ":O", ":X", ":P"];
function randEmoji(){
// remove old emoji first to avoid doing a recursive call
var check = oldEmoji? emojiList.filter(e => e !== oldEmoji ) : emojiList;
var emoji = check[Math.floor(Math.random() * check.length)];
oldEmoji = emoji
document.getElementById("emojiText").innerHTML = "Look how fun! ---> " + emoji + " <--- An emoji!";
console.log(emoji);
}
vous devez déclarer vos variables en dehors de la fonction et les définir à l'intérieur. sinon leurs valeurs sont réinitialisées à chaque appel de fonction
Lisez ceci .
Vous n'avez pas répondu ou marqué l'une des questions ci-dessous comme étant correcte? Si vous ne savez pas comment faire, sélectionnez la meilleure réponse qui a résolu votre problème, puis sélectionnez la coche grise
✓pour qu'elle devienne verte. De cette façon, cela signifie que la question a été résolue par cette réponse particulière.