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

Javascript 如何阻止程序连续两次输出相同的内容?,javascript,debugging,Javascript,Debugging,因此,我创建了这个HTML页面,其中包含一些JavaScript。我有一个按钮,输出六个表情中的一个。它工作得很好,然后我添加了一些代码来阻止程序连续两次输出相同的表情符号,但这没有任何区别,我也不知道为什么。 这是我的代码: function randEmoji() { var oldEmoji = emoji; var emojiList = [";)", ":D", "xD&

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

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);
            }
        }
函数randEmoji() { var oldEmoji=表情符号; 变量emojiList=[“;)”,“:D”,“xD”,“:O”,“:X”,“:P”]; var emoji=emojiList[Math.floor(Math.random()*emojiList.length)]; if(oldEmoji==表情符号) { randEmoji(); } 其他的 {
document.getElementById(“emojiText”).innerHTML=“看多有趣!-->“+emoji+”您必须在函数外部声明变量并在内部设置它们。否则,它们的值会在每次函数调用中重置

试试这个:

var oldEmoji='';
var emoji='';
变量emojiList=[“;)”,“:D”,“xD”,“:O”,“:X”,“:P”];
函数randEmoji(){
oldEmoji=表情符号;
emoji=emojiList[Math.floor(Math.random()*emojiList.length)];
if(oldEmoji==表情符号){
randEmoji();
}否则{
console.log(emoji);
}
}
var i=0;
而(i<20){
randEmoji();
i+=1;

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

试试这个:

var oldEmoji='';
var emoji='';
变量emojiList=[“;)”,“:D”,“xD”,“:O”,“:X”,“:P”];
函数randEmoji(){
oldEmoji=表情符号;
emoji=emojiList[Math.floor(Math.random()*emojiList.length)];
if(oldEmoji==表情符号){
randEmoji();
}否则{
console.log(emoji);
}
}
var i=0;
而(i<20){
randEmoji();
i+=1;

}
问题在于,函数完成执行后,函数作用域的任何局部变量(即函数内部声明的变量)都会被丢弃。因此,每次运行函数
emoji
oldEmoji
时,都会从
未定义的

一种解决方案是将其中一个声明移动到父范围,如下所示:

var-oldEmoji;
函数randEmoji(){
变量emojiList=[“;)”,“:D”];
var emoji=emojiList[Math.floor(Math.random()*emojiList.length)];
if(oldEmoji==表情符号){
randEmoji();
}否则{
console.log(emoji);
oldEmoji=表情符号;
}
}
randEmoji();
randEmoji();
randEmoji();
randEmoji();
randEmoji();
randEmoji();

randEmoji();
问题在于,函数完成执行后,函数作用域的任何局部变量(即函数内部声明的变量)都会被丢弃。因此,每次运行函数
emoji
oldEmoji
时,都会从
未定义的

一种解决方案是将其中一个声明移动到父范围,如下所示:

var-oldEmoji;
函数randEmoji(){
变量emojiList=[“;)”,“:D”];
var emoji=emojiList[Math.floor(Math.random()*emojiList.length)];
if(oldEmoji==表情符号){
randEmoji();
}否则{
console.log(emoji);
oldEmoji=表情符号;
}
}
randEmoji();
randEmoji();
randEmoji();
randEmoji();
randEmoji();
randEmoji();

randEmoji();
除了@full stack answer,您还可以:

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);
                    
  }
var oldEmoji='';
var emoji='';
变量emojiList=[“;)”,“:D”,“xD”,“:O”,“:X”,“:P”];
函数randEmoji(){
//首先删除旧的表情符号,以避免执行递归调用
var check=oldEmoji?emojiList.filter(e=>e!==oldEmoji):emojiList;
var emoji=check[Math.floor(Math.random()*check.length)];
表情符号

document.getElementById(“emojiText”).innerHTML=“看多有趣!-->“+emoji+”除了@full-stack-answer之外,您还可以:

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);
                    
  }
var oldEmoji='';
var emoji='';
变量emojiList=[“;)”,“:D”,“xD”,“:O”,“:X”,“:P”];
函数randEmoji(){
//首先删除旧的表情符号,以避免执行递归调用
var check=oldEmoji?emojiList.filter(e=>e!==oldEmoji):emojiList;
var emoji=check[Math.floor(Math.random()*check.length)];
表情符号

document.getElementById(“emojiText”).innerHTML=“看多有趣!-->”+emoji+“您必须在函数外部声明变量,并在函数内部进行设置。否则,它们的值会在每个函数callRead中重置。您尚未回答或将以下任何问题标记为正确?如果您不知道如何回答,请选择解决问题的最佳答案,然后选择灰色勾号
因此变为绿色。这样,这意味着问题已由该特定答案解决。您必须在函数外部声明变量并在内部设置它们。否则,它们的值将在每个函数callRead中重置。您尚未回答或将以下任何问题标记为正确?如果您不知道如何回答,请选择解决问题的最佳答案,然后选择灰色勾号
所以它变为绿色。这样,就意味着这个问题已经被那个特定的答案解决了。