如何停止我的程序连续两次输出相同的内容?

问题描述

因此,我创建了带有一些JavaScript的HTML页面我有这个按钮,可以输出六个表情符号中的一个。它工作正常,然后我添加了一些代码来阻止该程序连续两次输出相同的表情符号,但这没有任何区别,我也不知道为什么。
这是我的代码

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);
            }
        }

我不太擅长编程,也不知道是什么导致了这个问题。
请帮帮我!

解决方法

您必须在函数外部声明变量并将其设置在内部。否则,它们的值将在每次函数调用时重置。

尝试一下:

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;
}

,

问题在于,在函数完成执行之后,所有在函数作用域内局部的变量(意味着在函数内部声明的变量)都将被丢弃。因此,每次运行函数emojioldEmoji时,都会从undefined

重新实例化

一种解决方案是将这些声明之一移至父范围,如下所示:

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();

看到这里,我们实际上再也没有得到重复。

,

除了@ full-stack答案,您还可以:

var oldEmoji = '';
      var emoji = '';
      var emojiList = [";)",":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);
                    
  }