问题描述
因此,我创建了带有一些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;
}
,
问题在于,在函数完成执行之后,所有在函数作用域内局部的变量(意味着在函数内部声明的变量)都将被丢弃。因此,每次运行函数emoji
和oldEmoji
时,都会从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);
}